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

Dau*_*aev 5 django asynchronous celery django-celery

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

The*_*ter 8

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

只需像平常一样调用该方法即可:

TaskName() 
Run Code Online (Sandbox Code Playgroud)

delay只有当你想发送给worker时才需要使用。

  • 不会。您仍然可以调用指定为任务的方法,就像调用 python 中的任何其他方法一样。Celery 只是将调用添加到外部进程可以执行的队列中。如果您需要在 celery 内部和外部调用该任务(所谓外部,我的意思是在脚本执行过程中同步调用,而不需要轮询响应或类似的东西,或者使用任何异步工具),那么只需将其调用为普通的。不需要什么花哨的东西。它仍然是Python中能够返回值等的方法。 (3认同)

Spi*_*Xel 7

只需将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()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)