Comments 57
Вопрос. Вы тот Никита или тезка?
Радует, что PHP становится более универсален.
Подождите сейчас набегут рубисты скажут «похапе говно, я на нем писцал 5 лет назад, ничего не изменилось» :)
Уже ↓ :)
С точностью до наоборот.
Я не рубист. Похапэ не говно. Писал я на нем последний раз не 5, а 2,5 года назад.
И в нем все изменилось с того момента как я первый раз пытался разобраться со скриптом ( лет 7 назад, тогда еще php 4 был очень распространен). Раньше можно было подобрать десяток различных функций для выполнения одной операции с каким угодно порядком аргументов и любым методом именований функций. А теперь задачи можно решать еще и десятком различных парадигм и с помощью десятка способов записи.
p.s. прошу менч извинить тех, чьи религиозные чувства были задеты
Я не рубист. Похапэ не говно. Писал я на нем последний раз не 5, а 2,5 года назад.
И в нем все изменилось с того момента как я первый раз пытался разобраться со скриптом ( лет 7 назад, тогда еще php 4 был очень распространен). Раньше можно было подобрать десяток различных функций для выполнения одной операции с каким угодно порядком аргументов и любым методом именований функций. А теперь задачи можно решать еще и десятком различных парадигм и с помощью десятка способов записи.
p.s. прошу менч извинить тех, чьи религиозные чувства были задеты
Какие религиозные чувства? Здесь по-вашему фанатики PHP собрались? Тут сидят умные люди, работающие головой, и понимающие, что это просто инструмент… надеюсь.
Сейчас PHP действительно очень изменился. Я бы даже это назвал другим языком (PHP4 != PHP5 != PHP5.4 — это не булева алгебра:) ), настолько серьезные изменения в подходах.
Сейчас PHP действительно очень изменился. Я бы даже это назвал другим языком (PHP4 != PHP5 != PHP5.4 — это не булева алгебра:) ), настолько серьезные изменения в подходах.
Кухонный комбайн со встроенной подводной лодкой на солнечных батареях
<sarcasm>Теперь на PHP можно написать ОС уровня Windows 3.11</sarcasm>
Товарищи, я сам пишу на PHP, если что, причём очень давно и считаю его неплохим языком :). Если кто-то вдруг не понял, корутины добавляют поддержку сохранения _состояния_ выполнения функции, что дает возможность написать что-то вроде ОС, как например Windows 3.11. Если правильно реализовать все блокирующие вызовы, то оно даже будет работать. Если кто-то не согласен, что PHP не годится для написания более сложных ОС, прошу привести аргументы :).
На самом деле генераторы действительно очень крутая штука, первый раз столкнулся с ними в питоне и сразу не совсем понял зачем они мне вообще нужны пока не научился ими пользоваться.
Кстати замечу что код (понимаю что это пример, но все-же):
может все-таки зависнуть. Сокет может получить менее 8192 байт и вернет ошибку.
$data = (yield $socket->read(8192));
может все-таки зависнуть. Сокет может получить менее 8192 байт и вернет ошибку.
Вроде как нет:
Reading stops as soon as one of the following conditions is met:
— length bytes have been read
— EOF (end of file) is reached
— a packet becomes available or the socket timeout occurs (for network streams)
— if the stream is read buffered and it does not represent a plain file, at most one read of up to a number of bytes equal to the chunk size (usually 8192) is made; depending on the previously buffered data, the size of the returned data may be larger than the chunk size.
fread()
Не зависнет, а вернёт меньше чем 8192 байт. Поэтому при работе с неблокирующими сокетами нужно проверять сколько данных считалось и если меньше, чем просили — снова вставать в очередь на чтение.
в настоящее время внедряю использование сопрограмм в разных своих сервисах (на Си)
спасибо, что показали нам эту возможность для РНР…
думаю пригодится
спасибо, что показали нам эту возможность для РНР…
думаю пригодится
А кто-то может объяснить, зачем нужны (в практическом применении) корутины, ну помимо написания таскменеджера, который, почему-то видится в php как немного чуждая вещь?
Итератор в меньшее количество строк, например. И с двусторонней связью.
корутины применяются для псевдо-распараллеливания кода, так как пхп не поддерживает треды…
распараллеливание выгодно там, где есть операции в/в:
пока одна коротина занята приемом/отправлением данных — другая коротина может какие-то другие данные обработать.
один из вариантов использования — это мультиплексный асинхронный сервер
единственное, что хотелось бы увидеть от автора: это реализация двух серверов — один на libevent, воторй на коротинах и измерить их эффективность ( память, кол-во обработанных соединений за сек… )
я понимаю что это тема отдельной статьи, но све же может кто возмется???
распараллеливание выгодно там, где есть операции в/в:
пока одна коротина занята приемом/отправлением данных — другая коротина может какие-то другие данные обработать.
один из вариантов использования — это мультиплексный асинхронный сервер
единственное, что хотелось бы увидеть от автора: это реализация двух серверов — один на libevent, воторй на коротинах и измерить их эффективность ( память, кол-во обработанных соединений за сек… )
я понимаю что это тема отдельной статьи, но све же может кто возмется???
Только в один момент времени работает только одна корутина, в нашем случае сокеты сами отрабатывали в буффер, а потом считывались.
Т.е., речь-таки не об обычном применении php, а об узкоспециализированном.
Действительно не поддерживает? Или я в чём-то ошибся?
достоинство коротин (не в пхп) в том, что они позволяют распараллелить код, без накладных расходов в однопоточной модели. При этом всегда будет занято только одно ядро процессора, в отличие от тредовой модели. При реализации многотредовой модели появляются проблемы в синхронизации, затраты ресурсов на переключении контекста приложения между тредами и т.п…
считается что в ряде задач, решения на коротинах — эффективнее.
считается что в ряде задач, решения на коротинах — эффективнее.
еще корутины могут быть нужны при распределение вычислений между несколькими серверами задач:
родили несколько коротин, которые отправили данные на разные сервера задач: например обработка машинный перевод или распределенный поиск… далее переключая контекст коротин мы смотрим статусы задач и отдаем уже результат
родили несколько коротин, которые отправили данные на разные сервера задач: например обработка машинный перевод или распределенный поиск… далее переключая контекст коротин мы смотрим статусы задач и отдаем уже результат
Один к одному yield из питона (даже api генераторов то же). Странно, что об этом не упомянули в статье.
Более того, отсутствует поддержка yield from, который позволяет не дублировать код, а выносить части генераторов в отдельные генераторы.
Более того, отсутствует поддержка yield from, который позволяет не дублировать код, а выносить части генераторов в отдельные генераторы.
Очень полезная статья. И в целом PHP движется в верном направлении :)
Надеюсь выход php5.5 сподвигнет к обновлению хостеров хотя бы до 5.4
Надеюсь выход php5.5 сподвигнет к обновлению хостеров хотя бы до 5.4
У меня есть два вопроса:
Генератор обязательно должен быть глобальной функцией? Он может быть замыканием?
Когда релиз php 5.5? :)
Генератор обязательно должен быть глобальной функцией? Он может быть замыканием?
Когда релиз php 5.5? :)
А я все жду нормальные getters & setters, текущее извращение с __* надоело :(
Что за «корутины»? «Сопрограммы» нормальный же перевод. Почему только в заголовке.
Я знаю, таких как я не любят, но я не люблю многие русские слова. Некоторые из них просто до смешного ужасно звучат и их очень неудобно использовать в тех-литературе, например «сопрограмма», «область видимости» (scope — куда проще), «поток исполнения» (нифига не понятно, что имеется ввиду), и т.д..
Ясно, что не удобно использовать русские термины, но если пользоваться английскими, то их можно уж и оригинально писать, а не делать транслитерацию.
«Сопрограмма» ужасно звучит? О_О
Странно. А «подпрограмма», «сопроцессор» как, нормально? Приступов паники не вызывают? :)
Странно. А «подпрограмма», «сопроцессор» как, нормально? Приступов паники не вызывают? :)
Адекватные аналоги на русском можно и нужно использовать, как бы ужасно, по чьему-либо мнению, они не звучали. Чего не стоит делать, так это мешать «coroutines», «сопрограммы» и «корутины» в одном месте.
Калькирование «корутины» уже плохо тем, что провоцирует лингвистически неискушенного человека на ошибки при склонении.
В остальном перевод читается довольно гладко. Спасибо.
Калькирование «корутины» уже плохо тем, что провоцирует лингвистически неискушенного человека на ошибки при склонении.
В остальном перевод читается довольно гладко. Спасибо.
ОМГ, да вы посмотрите на это. Парсер PHP исчерпал себя. Для объявления джоин поинтов был внедрён отдельный синтаксис. А что будем делать с клиентом? Ах да, давайте теперь функция, которая вроде бы функция вдруг станет специальным объектом со специальным интерфейсом.
Кто мешал заимплементить операторы <</>>? Ой, так они же уже используются для бинарного сдвига. А что делать? Так давай в лоб сделаем, как получается. Думать некогда.
Кто мешал заимплементить операторы <</>>? Ой, так они же уже используются для бинарного сдвига. А что делать? Так давай в лоб сделаем, как получается. Думать некогда.
Ради этого ранта я даже компьютер включил.
Кстати не в первый раз тебя вижу в треде, но, как и в прошлый раз, больше чем просто побросаться словами ты не можешь.
> Парсер PHP исчерпал себя
Открыл америку. Парсер пхп делает все на лету, конечно он паршивый до нельзя, но он никуда не исчерпывал себя, он всегда таким был. В будущем собираются сделать AST-based парсер.
> Для объявления джоин поинтов был внедрён отдельный синтаксис
Каких джоин поинтов? где отдельный синтаксис? Джоин поинты относятся к АОП, причем тут генераторы?
> Ах да, давайте теперь функция, которая вроде бы функция вдруг станет специальным объектом со специальным интерфейсом.
Функция — не объект. Функция при вызове возвращает объект. Также сделано, например, в шарпе. Это очень даже логично.
>> Кто мешал заимплементить операторы <</>>?
Для чего? Я бы не хотел, чтобы эти операторы использовались для чего-то другого, кроме сдвига. Впрочем да, перегрузки операторов в юзерлэнде пхп не хватает.
Кстати не в первый раз тебя вижу в треде, но, как и в прошлый раз, больше чем просто побросаться словами ты не можешь.
> Парсер PHP исчерпал себя
Открыл америку. Парсер пхп делает все на лету, конечно он паршивый до нельзя, но он никуда не исчерпывал себя, он всегда таким был. В будущем собираются сделать AST-based парсер.
> Для объявления джоин поинтов был внедрён отдельный синтаксис
Каких джоин поинтов? где отдельный синтаксис? Джоин поинты относятся к АОП, причем тут генераторы?
> Ах да, давайте теперь функция, которая вроде бы функция вдруг станет специальным объектом со специальным интерфейсом.
Функция — не объект. Функция при вызове возвращает объект. Также сделано, например, в шарпе. Это очень даже логично.
>> Кто мешал заимплементить операторы <</>>?
Для чего? Я бы не хотел, чтобы эти операторы использовались для чего-то другого, кроме сдвига. Впрочем да, перегрузки операторов в юзерлэнде пхп не хватает.
Каких джоин поинтов? где отдельный синтаксис? Джоин поинты относятся к АОП, причем тут генераторы?А чем yeild не отдельный синтаксис, так же как echo к примеру? Уж не знал я как назвать точки приёма и отправки сообщений.
Для чего? Я бы не хотел, чтобы эти операторы использовались для чего-то другого, кроме сдвига.Да, для того же для чего был реализован yeild. Целостность. А так с одной стороны получается один подход, а с другой — другой.
Планировщик, для которого был написан пример, может быть выполнен
при помощи расширения ev:
Небольшие примеры.
Слежение за доступностью сокета, файла или другого узла может быть выполнено с помощью
EvIo. Асинхронные файловые операции
можно также выполнять, например, через eio_read, eio_write, eio_sendfile и др.
при помощи расширения ev:
<?php
$w1 = new EvIdle(function ($w) {
(--$w->data[0] <= 0) and $w->stop();
echo "Task 1, i = ", $w->data[0], PHP_EOL;
}, array (10));
$w2 = new EvIdle(function ($w) {
(--$w->data[0] <= 0) and $w->stop();
echo "Task 2, i = ", $w->data[0], PHP_EOL;
}, array (5));
Ev::run();
?>
Небольшие примеры.
Слежение за доступностью сокета, файла или другого узла может быть выполнено с помощью
EvIo. Асинхронные файловые операции
можно также выполнять, например, через eio_read, eio_write, eio_sendfile и др.
Возможно где то стоит упомянуть, что это перевод статьи nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
?
?
Sign up to leave a comment.
Coroutines в PHP и работа с неблокирующими функциями