在没有工人的情况下运行 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 任务的主要内容,如果未能解决你的问题,请参考以下文章