Size: a a a

2019 May 04

АФ

Артём Фролов in PHP fwdays
Alexandr Vronskiy
$gen = fn() => foreach ($periods as $date) yield select * from big table;
$resultFromParallelRequests = iterator_to_array($gen);
Бац, и сразу за секунду 10 запросов к бд, а не по одному каждую секунду...
Ну известно, что многопоточности нет в пыхе и не получится сделать также красиво, как здесь.

Однако можно использовать для периодов - очередь сообщений. Можно использовать symfony/process, но в этих двух случаях будут именно процессы (консьюмеры или воркеры), а не потоки. Неужели не решает в итоге?

Ещё должен помочь reactphp event loop, вы сами о нем вспоминали.

Конечно не так красиво как с многопоточными генераторами, но в пыхе7 эту задачу хотя бы реализовать можно и будет работать плюс-минус также быстро. Хоть и больше кода писать и выглядеть как костыль будет, если привыкнуть к наличию многопоточности на других языках, но реализуемо же?
источник

SP

Sergey Protko in PHP fwdays
Артём Фролов
Все равно не могу вдуплиться насчет i/o. То, что самые быстрые диски всё равно самое узкое место - это известно, но сейчас на серверах зачастую столько ram, что бывает можно установить такой заоблачный innodb_buffer_pool_size, что иногда и целая база может поместиться в ram. Чем больше буфер - тем меньше обращений к диску. В теории можно хоть всю бд поместить в ram, если она будет меньше допустимого innodb_buffer_pool_size.

А вот если например запустить много консьюмеров, которые будут что-то добавлять/изменять/удалять в одной таблице, вообще выполнять транзакции любые, то вырастет locktime, время ожидания освобождения блокировок, которое сам мускуль порождает. И сколько не профилировал запросы, i/o read/write конечно занимает время, но чаще всего меньше того locktime или самой выборки.

Или речь идет о том, что сами демоны обращаются к диску, что-то пишут на него или читают массово?

Очень интересная тема.
на счет lock time - а теперь представь что локи минимальны потому что у тебя все операции над данными изолированы, каждый в маленьком таком экторе, у каждого эктора маленький такой буфер сообщений, и каждый этот эктор делает что-то свое последовательно и все они работают в одном процессе (или даже в нескольких) деля процессорное время.

Проекты разные бывают. Если ты пилишь какой-нибудь твиттер/инстаграм/фэйсбук то ты не будешь в это упираться. Пилишь какую-нибудь систему документооборота где несколько человек могут одновременно работать с одним и тем же документом - тут нужны уже другие подходы что бы у всех все было хорошо. Или аукционы, видеоконференции какие и прочие вещи где "несколько человек одновременно работают с ресурсом" это обычное дело.

> И сколько не профилировал запросы, i/o read/write конечно занимает время, но чаще всего меньше того locktime или самой выборки.

с точки зрения твоего клиентского кода сделать запрос к БД это и есть операция ввода/вывода. Пока ты ждешь результат ты мог бы чего другого поделать, например разобрать запрос и понять для другого клиента чего выполнять и т.д.

> Или речь идет о том, что сами демоны обращаются к диску, что-то пишут на него или читают массово?

для php редко бывают задачи где диск медленный, ты как никак не пишешь каждый день какой-нибудь медиа сервер на пыхе. Все упирается в утилизацию процессорного времени. Если делать все синхронно и тебе там то в базу сходить надо то по сети куда-нибудь сходить то большую часть времени процесс с пыхом будет простаивать. А мог бы полезную работу делать.

> чтобы cli процесс уложил сервер целиком.

мне кажется что для тебя демоны/асинхронщина ограничиваются какими-то обработчиками сообщений из очереди или еще чего такое. Речь же идет о том что бы все приложение держать "не убивая", это добавляет пару вариантов как можно делать дела.

А если у тебя процесс обслуживает сотни клиентов, то случайный циклик заблочит работу для всех. Или скажем решил ты file_get_content заюзать какой (или что хуже - за тебя это решил автор библиотеки которую ты юзаешь для логов каких) и получаешь синхронную работу с файловой системой. Вроде не долго но тут чуть-чуть и там чуть-чуть и вот уже для всех клиентов время ожидания потихоньку увеличивается.

> Если с ним что-то не так, он вывалится по memory_limit рано или поздно...

или процесс свалится в своп. Оч занятное дело когда такое происходит.

> Или станет зомби процессом

процесс зомби звучит жутко но на самом деле это не так проблемно как процессы-сироты. В любом случае если у тебя там супервизор то странно откуда и тем и другим там взяться, разве что ты сам будешь плодить дочерние процессы.
источник

SP

Sergey Protko in PHP fwdays
Артём Фролов
Ну известно, что многопоточности нет в пыхе и не получится сделать также красиво, как здесь.

Однако можно использовать для периодов - очередь сообщений. Можно использовать symfony/process, но в этих двух случаях будут именно процессы (консьюмеры или воркеры), а не потоки. Неужели не решает в итоге?

Ещё должен помочь reactphp event loop, вы сами о нем вспоминали.

Конечно не так красиво как с многопоточными генераторами, но в пыхе7 эту задачу хотя бы реализовать можно и будет работать плюс-минус также быстро. Хоть и больше кода писать и выглядеть как костыль будет, если привыкнуть к наличию многопоточности на других языках, но реализуемо же?
известно что многопоточность не нужна (для 99% задач) - в нашем случае (где проблема именно с I/O) корутины справляются лучше.
источник

SP

Sergey Protko in PHP fwdays
Alexandr Vronskiy
Насчёт асинхрона и i/o, ситуации разные, когда ты просто хочешь разгрести очередь - наверное достаточно event loop'a, что-то делать над большим объемом данных - надо брать что-то многопоточное.
Продал бы душу за асинхронные и многопоточные генераторы (yield) в php)
между "большим объемом данных" и "многопоточное" пропущены какие-то допущения о которых хотелось бы знать чуть по больше. Как объемы данных связаны с тем как будет делиться процессорное время?

> Продал бы душу за асинхронные и многопоточные генераторы (yield) в php)

прям такие асинхронные и многопоточные что...

while(true) {
   yeild fn();
}

в примере выше fn будет выполняться каждый в разных тредах и на разных ядрах?
источник

SP

Sergey Protko in PHP fwdays
> Неужели не решает в итоге?

А что решает? с проблемой определитесь. Есть намного больше всякого интересного кроме как очередь разобрать.

Хороший пример, что бы просто и без изысков вроде "а еще можно эктор модел мутить", вэбхуки. Когда все что надо сделать это получить сообщение, проверить список подписчиков и отправить им http запросом. При этом чистой работы пыху тут на пару милисекунд а http запрос может и секунду-две висеть.
источник

AV

Alexandr Vronskiy in PHP fwdays
Сейчас многие когда говорят многопоточность подразумевают именно корутины, вот и я этим грешу, все же гугл классную штуку придумал)
источник

SP

Sergey Protko in PHP fwdays
Alexandr Vronskiy
Сейчас многие когда говорят многопоточность подразумевают именно корутины, вот и я этим грешу, все же гугл классную штуку придумал)
в го все чуть интереснее чем просто корутины
источник

SP

Sergey Protko in PHP fwdays
ну то есть... одно дело заставить в рамках одного процесса корутинки бегать, в похапе это возможно с 12-ого года (~7 лет, Карл), в питоне это вообще давно было. Но в go все же сильно по другому, хоть и идеи общие.

А еще есть эрланг.
источник

AV

Alexandr Vronskiy in PHP fwdays
Не спорю, чем отличаются горутины от корутин - целая наука. А если ещё и пробовать разобраться как это проецируется на треды...
источник

SP

Sergey Protko in PHP fwdays
вобщем из самого интересного на сегодняшний день был и остается эрланг в плане модели паралельных вычислений (реализация actor model, полная децентрализация). Go эдакое промежуточное звено тут (горутины и каналы сильно мне напоминают экторы и мэйлбоксы, но централизация в виде main рутины...)
источник

SP

Sergey Protko in PHP fwdays
Да и вообще вспомним почившего не так давно Армстронга:

https://www.youtube.com/watch?v=37wFVVVZlVU
источник

АФ

Артём Фролов in PHP fwdays
Sergey Protko
на счет lock time - а теперь представь что локи минимальны потому что у тебя все операции над данными изолированы, каждый в маленьком таком экторе, у каждого эктора маленький такой буфер сообщений, и каждый этот эктор делает что-то свое последовательно и все они работают в одном процессе (или даже в нескольких) деля процессорное время.

Проекты разные бывают. Если ты пилишь какой-нибудь твиттер/инстаграм/фэйсбук то ты не будешь в это упираться. Пилишь какую-нибудь систему документооборота где несколько человек могут одновременно работать с одним и тем же документом - тут нужны уже другие подходы что бы у всех все было хорошо. Или аукционы, видеоконференции какие и прочие вещи где "несколько человек одновременно работают с ресурсом" это обычное дело.

> И сколько не профилировал запросы, i/o read/write конечно занимает время, но чаще всего меньше того locktime или самой выборки.

с точки зрения твоего клиентского кода сделать запрос к БД это и есть операция ввода/вывода. Пока ты ждешь результат ты мог бы чего другого поделать, например разобрать запрос и понять для другого клиента чего выполнять и т.д.

> Или речь идет о том, что сами демоны обращаются к диску, что-то пишут на него или читают массово?

для php редко бывают задачи где диск медленный, ты как никак не пишешь каждый день какой-нибудь медиа сервер на пыхе. Все упирается в утилизацию процессорного времени. Если делать все синхронно и тебе там то в базу сходить надо то по сети куда-нибудь сходить то большую часть времени процесс с пыхом будет простаивать. А мог бы полезную работу делать.

> чтобы cli процесс уложил сервер целиком.

мне кажется что для тебя демоны/асинхронщина ограничиваются какими-то обработчиками сообщений из очереди или еще чего такое. Речь же идет о том что бы все приложение держать "не убивая", это добавляет пару вариантов как можно делать дела.

А если у тебя процесс обслуживает сотни клиентов, то случайный циклик заблочит работу для всех. Или скажем решил ты file_get_content заюзать какой (или что хуже - за тебя это решил автор библиотеки которую ты юзаешь для логов каких) и получаешь синхронную работу с файловой системой. Вроде не долго но тут чуть-чуть и там чуть-чуть и вот уже для всех клиентов время ожидания потихоньку увеличивается.

> Если с ним что-то не так, он вывалится по memory_limit рано или поздно...

или процесс свалится в своп. Оч занятное дело когда такое происходит.

> Или станет зомби процессом

процесс зомби звучит жутко но на самом деле это не так проблемно как процессы-сироты. В любом случае если у тебя там супервизор то странно откуда и тем и другим там взяться, разве что ты сам будешь плодить дочерние процессы.
Понял тебя, у меня действительно асинхронщина крутится вокруг специфических тяжелых задач, очередей, консьюминга и всего такого. То есть приложение для пользователей постоянно в памяти не сидит и умирает сразу после отдачи респонса чисто по классике. Такого как ты говоришь никогда на пыхе не делал. Делал только классические десктопные приложения на каком-нибудь с# , где типа есть сам ui, он в одном потоке сидит, а если что-то тяжелое, то выполняешь в отдельных и интерфейс не лагает. С института эти знания не доводилось применять) это оно, в твоём понимании асинхронщина?

На пыхе reactphp для этого дела используешь? Почему не подходит обычный “умирающий пых»?

Про корутины почитаю спасибо, это в принципе для меня ответ зачем нужен го и чего не умеет пыха.
источник

SP

Sergey Protko in PHP fwdays
Артём Фролов
Понял тебя, у меня действительно асинхронщина крутится вокруг специфических тяжелых задач, очередей, консьюминга и всего такого. То есть приложение для пользователей постоянно в памяти не сидит и умирает сразу после отдачи респонса чисто по классике. Такого как ты говоришь никогда на пыхе не делал. Делал только классические десктопные приложения на каком-нибудь с# , где типа есть сам ui, он в одном потоке сидит, а если что-то тяжелое, то выполняешь в отдельных и интерфейс не лагает. С института эти знания не доводилось применять) это оно, в твоём понимании асинхронщина?

На пыхе reactphp для этого дела используешь? Почему не подходит обычный “умирающий пых»?

Про корутины почитаю спасибо, это в принципе для меня ответ зачем нужен го и чего не умеет пыха.
в эру хайпа вокруг микросервисов и прочих распределенных систем короч... но да это не всем пока надо
источник

SP

Sergey Protko in PHP fwdays
> На пыхе reactphp для этого дела используешь? Почему не подходит обычный “умирающий пых»?

Я стараюсь не юзать для подобного пых. Вообще. У меня не так много свободного времени) хватило эксперементов
источник

SP

Sergey Protko in PHP fwdays
> Про корутины почитаю спасибо, это в принципе для меня ответ зачем нужен го и чего не умеет пыха.

го стоит рассматривать исключительно с точки зрения продуманного языка с упором на конкуренси. Это то что там сделано хорошо. Все остальное (отсутствие сахара и тупость) ему на этом фоне можно простить
источник

SP

Sergey Protko in PHP fwdays
а ну и еще структурный тайпинг...
источник

AV

Alexandr Vronskiy in PHP fwdays
Возращаясь к теме пхп, сейчас у него такой период когда в него пытаются запихнуть максимально широкие возможности, при этом не создавая узкоспециализированный продукт (типа переходите на типизацию и точка, а в 8 версии прикроем старую лавочку). Вот в этот сложный период нужен опыт как с помощью пхп не прострелить себе что-то не в положенном для этого месте)... а то тенденции последних продуктов типа роадраннера или компиляции в бинарник уже начинают пугать)
источник

SP

Sergey Protko in PHP fwdays
p.s. вообще я думаю что ближайшие пару лет нас ждут интересные времена interop между языками (webassembly, graalvm) - во всяком случае это было бы замечательно.
источник

SP

Sergey Protko in PHP fwdays
Alexandr Vronskiy
Возращаясь к теме пхп, сейчас у него такой период когда в него пытаются запихнуть максимально широкие возможности, при этом не создавая узкоспециализированный продукт (типа переходите на типизацию и точка, а в 8 версии прикроем старую лавочку). Вот в этот сложный период нужен опыт как с помощью пхп не прострелить себе что-то не в положенном для этого месте)... а то тенденции последних продуктов типа роадраннера или компиляции в бинарник уже начинают пугать)
чем они пугают?
источник

AV

Alexandr Vronskiy in PHP fwdays
В плане "зачем, для чего, что не хватало до них".)
источник