Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 芹菜:调用远程任务时如何添加回调函数(使用send_任务)_Python_Django_Multiprocessing_Celery - Fatal编程技术网

Python 芹菜:调用远程任务时如何添加回调函数(使用send_任务)

Python 芹菜:调用远程任务时如何添加回调函数(使用send_任务),python,django,multiprocessing,celery,Python,Django,Multiprocessing,Celery,您可以使用芹菜按名称调用在不同进程(甚至在不同机器上)中注册的任务: () 我现在希望能够添加一个回调,该回调将在任务完成后立即执行,并且将在调用任务的进程中执行 我的设置 我有一个服务器a,它运行一个django支持的网站,我使用一个基本的芹菜设置,如前所述。我没有在服务器a上运行芹菜工人 然后是服务器B,它运行(几个)芹菜工人 到目前为止,这个设置似乎运行得很好。我可以在服务器A上发送任务,然后在远程服务器B上执行 问题 唯一的问题是,我无法添加回调函数 在文档中,它说,您可以通过提供后续任

您可以使用芹菜按名称调用在不同进程(甚至在不同机器上)中注册的任务:

()

我现在希望能够添加一个回调,该回调将在任务完成后立即执行,并且将在调用任务的进程中执行

我的设置

我有一个服务器a,它运行一个django支持的网站,我使用一个基本的芹菜设置,如前所述。我没有在服务器a上运行芹菜工人

然后是服务器B,它运行(几个)芹菜工人

到目前为止,这个设置似乎运行得很好。我可以在服务器A上发送任务,然后在远程服务器B上执行

问题

唯一的问题是,我无法添加回调函数

在文档中,它说,您可以通过提供后续任务来添加回调。所以我可以这样做:

@celery.task
def result_handler(result):
    print "YEAH"

celery.send_task(task_name, args=args, kwargs=kwargs, link=result_handler.s())
然而,这意味着,我必须在服务器a上启动一个worker,该worker注册任务“result\u handler”。即使我这样做了,处理程序也会在worker生成的进程中被调用,而不是django进程,也就是调用任务


我能想出的唯一解决方案是一个无休止的循环,每2秒钟检查一次任务是否准备就绪,但我认为应该有一个更简单的解决方案。

busywait是在给定任务完成后在非工作进程中运行任何内容的唯一解决方案。也许你可以改变你的设计,这样你就不需要在同一个过程中运行回调了?@RobertJørgensgaardEngdahl谢谢,不过这是个坏消息。在某些时候,我必须将任务的结果存储在数据库中,我希望在Django中这样做。因此,不幸的是,我不知道如何在Django中不执行回调的情况下更改我的设计。您是否尝试过链式策略:@xecgr我可能弄错了,但这似乎无助于在启动任务的进程中执行处理函数。或者你能详细说明一下这应该怎么做吗?你是赖特。如果需要在执行过程中保存一些数据,我会考虑将其拆分为两个函数;对第一部分执行delay().get(),存储所需内容,其余部分使用第二个函数。这不是很优雅,但可能有用
@celery.task
def result_handler(result):
    print "YEAH"

celery.send_task(task_name, args=args, kwargs=kwargs, link=result_handler.s())