2016-09-16 149 views
2

如何运行所有芹菜任务没有工人,我的意思是直接打电话? 我可以使用TaskName.run()调用任务,但是我想在配置中编写它,所以如何使它成为可能?没有工人运行芹菜任务

回答

4

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

如果你希望能够做到这一点每个特定的任务,你可以用运行它们适用()的run()如你所提到的,而不是用apply_async()延迟运行它们()

所以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 
0

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

只要调用方法为正常:

TaskName() 

你只需要使用delay当你想将它传送给工人。

+0

确定,但你如何得到返回值?这仍然是由芹菜 – kentor

+1

包裹在其他东西。你仍然可以总是调用一个方法指定为一个任务,你可以调用任何其他方法在Python中。 Celery只是将调用添加到外部进程可以执行的队列中。如果你需要在芹菜内外调用这个任务(并且在外部,我的意思是同步执行一个脚本,而不是轮询响应或类似的东西,或者使用任何异步工具),然后将其称为正常。没有什么奇特的需要。它仍然是一个可以返回值的方法,等等。 –