Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 如何在Django等待芹菜任务的结果_Python_Django_Django Rest Framework_Celery_Celery Task - Fatal编程技术网

Python 如何在Django等待芹菜任务的结果

Python 如何在Django等待芹菜任务的结果,python,django,django-rest-framework,celery,celery-task,Python,Django,Django Rest Framework,Celery,Celery Task,我有一个芹菜任务,它将数据发送到另一个服务。我已将芹菜任务send\u inventory\u request添加到RequestSupplyStock基于类的视图中。当我发表文章时,我应该首先从芹菜任务中获得结果,然后继续并返回响应。我想先等待芹菜任务的结果,然后返回post方法的响应,这是实现这一点的正确方法 @app.task def send_inventory_request(payload,token): auth = {'authorization':token}

我有一个芹菜任务,它将数据发送到另一个服务。我已将芹菜任务
send\u inventory\u request
添加到
RequestSupplyStock
基于类的视图中。当我发表文章时,我应该首先从芹菜任务中获得结果,然后继续并返回响应。我想先等待芹菜任务的结果,然后返回post方法的响应,这是实现这一点的正确方法

@app.task
def send_inventory_request(payload,token):
    auth = {'authorization':token}
    HEADERS.update(auth)
    url = PROCUREMENT_SUPPLY_STOCK_REQUESTS_URL
    res = requests.post(url,json=payload,headers=HEADERS)
    inventory_request_data = res.json()
    x= logger.info('Supply Stock Request {0} + {1}'.format(payload,token))
    print(x)
    return inventory_request_data 
看法 你可以用芹菜,但不推荐

在任务中等待任务可能会导致死锁。请阅读 避免启动同步子任务


正如其他人在评论中已经提到的,以同步方式等待结果违背了使用芹菜的目的,但是如果您仍然需要等待结果,则不要延迟

只需像普通方法一样调用任务,它将同步运行并返回结果:

send_inventory_request(payload,get_token(request))

芹菜的全部意义在于,你不必等待长时间运行的任务。如果你需要等待,不要使用芹菜,直接在视图中进行。如果你依赖芹菜任务结果,那么芹菜任务肯定没有用。但是,如果你需要为一些特殊情况做些什么,只需毫不延迟地调用该任务即可。我想说的是‘发送库存请求’(有效负载,获取令牌(请求))`。这将返回结果。我需要将项目发送到另一个服务。我的方法是使用任务将库存请求发送到另一个服务。我完全同意,我不需要等待结果,但如果出现问题,我可以让他们排队并让他们重试。那么为什么不简单地使用try,除了block或retry decorator,如果您没有收到所需的响应,只需按照预先定义的最大重试限制重试即可。如果要使用芹菜任务,正确的解决方案是将任务id作为响应值返回,并提供另一个入口点以获取任务的状态(以及完成后的结果)-客户端将负责轮询另一个入口点。这是真的,我想我会避免这种方法,并从文档中阅读更多关于芹菜的内容。除非您需要在其他工作人员身上执行任务,否则这是可行的。在这种情况下,您必须使用延迟/等待方法,否则任务将在本地执行。
task = send_inventory_request.delay(payload,get_token(request))
result = task.wait(timeout=None, interval=0.5)
send_inventory_request(payload,get_token(request))