LINUX.ORG.RU

php-многопоточность

 , ,


0

1

Доброго времени суток. С-но есть задача - реализовать многопоточное общение с сервером по API. Суть такая - пользователь загружает файл для распознавания, получает id, по которому потом делает запрос. Если распознавание готово - получает один ответ, если не готово - другой. В этом случае запрос повторяется. Делаю это с помощью curl. Нашел функцию curl_multi_init Здесь , однако в примере указано, что сперва формируются несколько соединений, а уже потом запускаются все сразу в цикле. У меня же ситуация следующая: Допустим один пользователь делает запрос - стартует один поток. Потом еще два пользователя - выполнение уже в три потока, тут первый пользователь получил данные, его поток завершается, но еще три новых пользователя запрашивают данные...

Я пока не понимаю, как организовать что-то типа очереди, откуда по мере исполнения одни потоки будут удалятся, другие наоборот добавляться. Может кто подскажет куда копать? Заранее спасибо

Почему не запускать по 1 копии скрипта на каждого пользователя? У тебя же там не демон будет, а вызвал -> получил-отдал ответ -> умер.

xtraeft ★★☆☆ ()
Последнее исправление: xtraeft (всего исправлений: 1)

Запускаешь новый процесс интерпретатора через exec(), оттуда же получаешь его PID, пишешь в базу например. Пользак «пингует» окончание работы процесса (привязан по пиду), если процесс завершился то PID'а по ps не будет, значит задача сделана.

deep-purple ★★★★★ ()

Че ты придумываешь тут? делаешь очередь задач, травишь на нее воркеров и все.

umren ★★★★★ ()

Может кто подскажет куда копать?

Про очередь верно сказано.

одни потоки будут удалятся, другие наоборот добавляться

Потоки тут не нужны.

Очередь в redis/postgresql.

event_reactor подписан на события очереди и выбирает next_job, затем отправляет http-запрос в пул воркеров.

Пул воркеров может быть любым prefork-server. Это Apache с CGI/FastCGI или любое другое решение.

Весь жизненный цикл обработки данных это некая сессия, имеющая sid (session id). Любой шаг сессии отдельный запрос к пулу воркеров.

outtaspace ★★★ ()
Ответ на: комментарий от outtaspace

выбирает next_job, затем отправляет http-запрос в пул воркеров.

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

outtaspace ★★★ ()

Сталкивался с подобной проблемой. С курлом это вроде нельзя сделать. Сделал отправку запросов через неблокирующие соккеты. И зря :) потратил кучу времени, проще запустить несколько процессов, если нужно побыстрее, и тянуть задачи из пула задач. Если, конечно, количество запросов, которые нужно выполнять одновременно, не исчисляется сотнями :)

goingUp ★★★★★ ()
Последнее исправление: goingUp (всего исправлений: 4)
Ответ на: комментарий от outtaspace

Спасибо за ответ! Я правильно понял, что я храню задачи в БД, далее скрипт периодически дергает БД, запрашивает оттуда все активные задачи и порождает столько потоков, сколько нужно? Далее, если задача выполнена, то запись удаляется из БД или делается неактивной?

Т.е. скрипт юзера пишет в БД задачу, а есть глобальный скрипт, который выполняет все задачи разом?

Если так, тогда вопросы: Получается, что наш глобальный скрипт должен периодически дергаться, например, раз в 10 секунд? Т.е. подвешиваешь его на cron, например? Или же тут другая схема реализации?

gwyllum ()
Ответ на: комментарий от gwyllum

далее скрипт периодически дергает БД

База данных дает нам API для publish/subscribe. Мы подписываемся на уведомления, используя этот API. Пусть это будет mailbox, в который надо часто заглядывать.

запрашивает оттуда все активные задачи

Зависит от потребностей и API очереди. Это могут быть полные описания задачи, или просто id по которому можно достать описание из БД, или сигнал что пора вынуть из БД все новые задачи.

и порождает столько потоков, сколько нужно?

Нет. Потоки он не порождает. Он посылает неблокирующие запросы в пул воркеров. Можно контролировать количество отправленных запросов, а можно забить. Численность самих воркеров тоже можно менять самостоятельно или забить на это. Как реализован пул воркеров, нам знать не обязательно, это могут быть потоки или процессы (мне пока хватает prefork-сервера, который обрабатывает http-запросы).

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

Event reactor это демон, который стартует один раз и подписывается на события проиходящие в очереди. Насколько часто опрашивать mail box, зависит от задачи, можно начать с 100 запросов в секунду.

outtaspace ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.