【问题标题】:Wait till all tasks are run in Celery python等到所有任务都在 Celery python 中运行
【发布时间】:2020-05-03 06:56:10
【问题描述】:

我在 python 中使用 celery 来执行异步任务。在分配给所有工作人员的所有任务完成后,我想捕获它的结果。

为此,我使用 .get() 方法,但 get() 的问题是所有任务都被分配给一个同步的工作人员,但我想要这些任务分发给所有可用的工人。

下面是我的sn-p。

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

celery 中还有其他方法可以等到所有任务异步运行吗?

【问题讨论】:

    标签: python-3.x asynchronous django-celery celery-task


    【解决方案1】:

    但是 get() 的问题是所有任务都被分配给一个同步的工作人员

    嗯,不完全是。任务分配的工作方式完全相同(即使它似乎可以这样做),并且任务本身仍然是异步的。不同之处在于 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() 调用现在将等待所有任务完成,但它们将并行启动。

    【讨论】:

    • 我按照你上面提到的做了,但是我得到一个错误说“ res = jobs.get(), TypeError: get expected at least 1 arguments, got 0' 你能帮忙吗?跨度>
    • @Mahesh 抱歉,我无法通过断章取义的简单错误消息帮助任何人。但是回溯肯定会告诉你错误在哪里。
    • 当然,布鲁诺,我会解决的。感谢您的努力。
    • @Mahesh 重新阅读您的评论和代码 sn-p,实际上缺少一些东西(我的错)。我修复了代码 sn-p ;-)
    • 很棒的布鲁诺,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2021-04-26
    • 2013-10-09
    相关资源
    最近更新 更多