Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在芹菜中设置回调_Python_Celery - Fatal编程技术网

Python 如何在芹菜中设置回调

Python 如何在芹菜中设置回调,python,celery,Python,Celery,我想给一个函数添加回调,这样当它返回时就可以调用一个常规python函数 我的任务 @celery.task def add(x, y):

我想给一个函数添加回调,这样当它返回时就可以调用一个常规python函数

我的任务

@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)
,但确实有效。