Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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 等待任务内部的外部Web服务的结果_Python_Celery - Fatal编程技术网

Python 等待任务内部的外部Web服务的结果

Python 等待任务内部的外部Web服务的结果,python,celery,Python,Celery,我需要编写一组任务,其中每个任务都需要查询外部web服务。web服务总是以202接受状态进行回复,并在Location头中指向可以轮询结果的URI。此web服务交付结果所需的时间从2秒到1分钟不等。我想知道什么是最好的方法来规划我的芹菜任务。目前,我发送请求并启动while循环,直到成功轮询结果,例如: while True: result = poll_webservice() if result: break else: time.sl

我需要编写一组任务,其中每个任务都需要查询外部web服务。web服务总是以202接受状态进行回复,并在Location头中指向可以轮询结果的URI。此web服务交付结果所需的时间从2秒到1分钟不等。我想知道什么是最好的方法来规划我的芹菜任务。目前,我发送请求并启动while循环,直到成功轮询结果,例如:

while True:
    result = poll_webservice()
    if result:
        break
    else:
        time.sleep(5)

[ continue with the rest of the task ]

虽然这确实有效,但对我来说似乎非常粗糙,而且我阻止了芹菜工人,直到调查结果出来。有没有更好的办法

你肯定在消耗你的资源。只需查询您的外部web服务并保存要轮询的URI(使用缓存或db)。然后您就可以有一个用于收集结果的数据库,如果准备好了…

我想使用芹菜任务来轮询202响应提供的位置。如果它完成了,那么它将对其进行处理,否则它将在一段时间后重新对自身(或自身的副本)排队


对于奖励积分,如果您有很多这样的任务,您可以在每次响应未准备好时增加轮询间隔时间。

使用
任务如何。重试

@task(max_retries=100)
def poll_webservice_task(url):
    result = poll_webservice(url)
    if result:
       return result
    poll_webservice_task.retry(countdown=5)

如果您正在调用一个真正的Web服务,那么脚本应该只在得到答案时才继续运行-请参阅examples@JMax,有可能发生类似的事情,所以他不能这样做。@hymloth:谢谢你指出这一点。@hymloth:还必须记住设置适当的
max\u retries
@task(max\u retries=None)
没有限制。这就是方法。我不知道应用异步的
倒计时
eta
参数。有了这些参数和子任务的使用,我认为我可以很好地解决这个问题。谢谢你的意见。