【问题标题】:Run celery task without workers在没有工人的情况下运行 celery 任务
【发布时间】:2017-01-24 05:06:10
【问题描述】:

如何在没有工人的情况下运行所有​​芹菜任务,我的意思是直接调用? 我可以用TaskName.run()调用任务,但是我想在配置中写这个,怎么做呢?

【问题讨论】:

    标签: django asynchronous celery django-celery


    【解决方案1】:

    如果我理解你的话,你想同步调用任务。

    正常调用方法即可:

    TaskName() 
    

    您只需要在要将其发送给工作人员时使用delay

    【讨论】:

    • 好的,但是你如何获得返回值呢?这仍然被芹菜包裹在别的东西中
    • 没有。你仍然可以调用指定为任务的方法,就像调用 python 中的任何其他方法一样。 Celery 只是将调用添加到外部进程可以执行的队列中。如果您需要在 celery 内部和外部调用该任务(以及外部,我的意思是在脚本执行期间同步而不轮询响应或类似的东西,或使用任何异步工具),然后将其称为普通的。没有什么花哨的需要。它仍然是python中能够返回值等的方法。
    【解决方案2】:

    只需将 CELERY_ALWAYS_EAGER 设置为 true,这将强制 celery 不将任务排队并在当前进程中同步运行。

    如果您希望能够为每个特定任务执行此操作,您可以使用 apply()run() 来运行它们,而不是运行它们使用 apply_async()delay()

    所以 tl;博士:

    CELERY_ALWAYS_EAGER = True
    # The following two would do and act the same, processing synchronously
    my_task.run() 
    my_task.delay()
    

    但是

    CELERY_ALWAYS_EAGER = False
    # These two won't be the same anymore.
    my_task.run() # Runs synchronously
    my_task.delay() # Passed to the queue and runs Asynchronously, in another process
    

    【讨论】:

      【解决方案3】:

      作为对 SpiXel 回答的补充,从 this answer 开始,CELERY_ALWAYS_EAGER 在 4.0+ 版本中已重命名为 CELERY_TASK_ALWAYS_EAGER。使用 Django 1.11+Celery 4.1.0 为我工作。所以……

      CELERY_TASK_ALWAYS_EAGER = False #assync
      CELERY_TASK_ALWAYS_EAGER = True #serial
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 2012-12-26
        • 2023-01-08
        • 2019-07-25
        • 2021-12-12
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多