等到所有任务都在 Celery python 中 运行
Wait till all tasks are run in Celery python
我在 python 中使用 celery 进行异步任务。我想在分配给所有工人的所有任务完成后捕获它的结果。
为此,我正在使用 .get() 方法,但是 get() 的问题是所有任务都被分配给同步的单个 worker但我希望将任务分配给所有可用的工作人员。
下面是我的代码片段。
for url in urls:
res = good_bad_urls.delay(url[1])
res.get()
return JsonResponse(some_data)
celery有没有其他方法异步等到所有任务运行?
but the problem with get() is that all the tasks are being assigned to a single worker which is synchronous
嗯,不完全是。任务分配的工作原理是一样的(即使它可以 似乎 不这样做),并且任务本身仍然是异步的。不同之处在于 result.get()
是一个阻塞调用 - 因此在您的情况下,它会等待当前任务完成,直到它启动下一个任务。
但无论如何:这里的解决方案是use a Group。在你的情况下,它应该看起来像
jobs = group([good_bad_urls.s(url[1]) for url in urls])
async_res = jobs.apply_async()
result = async_res.get()
get()
调用现在将等待所有任务完成,但它们将并行启动。
我在 python 中使用 celery 进行异步任务。我想在分配给所有工人的所有任务完成后捕获它的结果。
为此,我正在使用 .get() 方法,但是 get() 的问题是所有任务都被分配给同步的单个 worker但我希望将任务分配给所有可用的工作人员。
下面是我的代码片段。
for url in urls:
res = good_bad_urls.delay(url[1])
res.get()
return JsonResponse(some_data)
celery有没有其他方法异步等到所有任务运行?
but the problem with get() is that all the tasks are being assigned to a single worker which is synchronous
嗯,不完全是。任务分配的工作原理是一样的(即使它可以 似乎 不这样做),并且任务本身仍然是异步的。不同之处在于 result.get()
是一个阻塞调用 - 因此在您的情况下,它会等待当前任务完成,直到它启动下一个任务。
但无论如何:这里的解决方案是use a Group。在你的情况下,它应该看起来像
jobs = group([good_bad_urls.s(url[1]) for url in urls])
async_res = jobs.apply_async()
result = async_res.get()
get()
调用现在将等待所有任务完成,但它们将并行启动。