在没有工人的情况下运行 celery 任务

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在没有工人的情况下运行 celery 任务的主要内容,如果未能解决你的问题,请参考以下文章

芹菜:启动时启动任务

2021-11-09

【celery】任务重复执行

如何检查处理 Celery 任务的队列

检查我的所有工人是不是都在 celery 中在线

celery基础