Дождитесь запуска всех заданий в Сельдерее python - PullRequest
0 голосов
/ 16 января 2020

Я использую сельдерей в python для асинхронных задач . Я хочу зафиксировать его результат после того, как все задачи, поставленные перед всеми работниками, выполнены.

Для этого я использую метод .get () , но проблема с get () состоит в том, что все задачи назначаются одному работнику, который работает синхронно, но я хочу задачи, которые будут распределены среди всех доступных рабочих.

Ниже приведен мой фрагмент.

for url in urls:
    res = good_bad_urls.delay(url[1])
    res.get()
return JsonResponse(some_data)

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

1 Ответ

1 голос
/ 16 января 2020

но проблема с get () заключается в том, что все задачи назначаются одному работнику, который является синхронным

Ну, не совсем так. Распределение задач работает точно так же (даже если он может кажется действовать иначе), а сами задачи все еще асин c. Разница в том, что result.get() является блокирующим вызовом, поэтому в вашем случае она ожидает, пока текущая задача не завершится sh, пока не запустит следующую.

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

jobs = group([good_bad_urls.s(url[1]) for url in urls])
async_res = jobs.apply_async()  
result = async_res.get()

Теперь вызов get() будет ожидать завершения всех задач, но они будут запускаться параллельно.

...