【发布时间】:2017-01-24 05:06:10
【问题描述】:
如何在没有工人的情况下运行所有芹菜任务,我的意思是直接调用? 我可以用TaskName.run()调用任务,但是我想在配置中写这个,怎么做呢?
【问题讨论】:
标签: django asynchronous celery django-celery
如何在没有工人的情况下运行所有芹菜任务,我的意思是直接调用? 我可以用TaskName.run()调用任务,但是我想在配置中写这个,怎么做呢?
【问题讨论】:
标签: django asynchronous celery django-celery
如果我理解你的话,你想同步调用任务。
正常调用方法即可:
TaskName()
您只需要在要将其发送给工作人员时使用delay。
【讨论】:
只需将 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
【讨论】:
作为对 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
【讨论】: