Python 如何在芹菜中设置回调
我想给一个函数添加回调,这样当它返回时就可以调用一个常规python函数 我的任务Python 如何在芹菜中设置回调,python,celery,Python,Celery,我想给一个函数添加回调,这样当它返回时就可以调用一个常规python函数 我的任务 @celery.task def add(x, y):
@celery.task
def add(x, y):
return x + y
我想如何使用它:
from __future__ import print_function
delay.add(2, 3 ,callback=lambda x: print x)
它可以是芹菜任务中未定义的任何函数,而不是lambda
但是从何处调用任务。在这种情况下,您只能链接任务:
add.apply_async((2, 3), link=other_task.s())
这与:
(add.s(2, 3) | other_task.s())()
等待任务完成会使任务同步,因此您需要的调用将
相当于:
(lambda x: print(x))(add.delay(2, 3).get())
这将阻止当前进程,直到任务返回。
如果不希望进程阻塞,则必须编写
一个专用线程,用于等待结果并调用回调
或者您可以使用eventlet/gevent编写普通代码。回调是否总是必须定义为任务?因为如果我有一个复杂的图,有很多依赖节点,我必须声明为任务,那么我所有的应用程序逻辑都将在tasks.py中,这并不理想……我正在尝试在我的代码
send\u email.apply\u async(args=[json.dumps(payload)]中使用回调,exchange=CELERY\u exchange,routing\u key=CELERY\u routing\u key,link=save\u email\u response.子任务((invite\u id,candidate.id,)
但它没有调用save\u email\u response
。我已经用rdb验证了这一点,甚至尝试了(send_email.s(args=[json.dumps(payload)]);save_email_response.s(invite_id,candidate.id))(exchange=cellery_exchange,routing_key=cellery_routing_key)
,但确实有效。