Приветствую.
Прошу подсказки с таким моментом. Есть таск, который выполняется долго. В нём происходит общение с чужим API, которое и занимает большую часть времени. Алгоритм такой:
- Читаем из базы исходные данные, готовим и разбиваем на порции. Это довольно быстро.
- Итерируем массив порций, отправляем каждую в API, получаем ответ, пишем его в базу. А вот это очень медленно.
- Обрабатываем все полученные данные, пишем ещё и результат обработки. Это тоже довольно быстро.
Что бы ускорить выполнение этого таска, очевидно нужно отправлять порции данных в API параллельно, а не последовательно. Варианты, первыми пришедшие в голову:
- Gearman. Но, кажется, это что-то не совсем то или я не понимаю, как с ним работать. Мне не нужно просто сплавить работу воркерам, мне нужно запустить их именно параллельно и дождавшись результата работы всех воркеров, выполнить финальное действие. Может быть нужно добавить задачи как фоновые, а потом смотреть на список задач на job-сервере?
- pcntl_fork. Здесь не до конца понимаю принцип работы: в какой-то момент у меня есть массив довольно больших объектов. Мне нужно выполнить отправку частей этого массива с разными параметрами (разные реквизиты доступа к API, например). В таком случае, понадобится форкнуться нужное число раз, получить «приветы» от клонов, раздать им данные и ждать от каждого ответа? Или я всё усложняю?
- Ещё думал дожидаться завершения работы потомков по каким-нибудь .pid файлам.
Но что-то мне подсказывает, что существует какое-то иное решение или лучшее понимание проблемы.
Заранее спасибо за подсказки.