Python 等待任务内部的外部Web服务的结果
我需要编写一组任务,其中每个任务都需要查询外部web服务。web服务总是以202接受状态进行回复,并在Location头中指向可以轮询结果的URI。此web服务交付结果所需的时间从2秒到1分钟不等。我想知道什么是最好的方法来规划我的芹菜任务。目前,我发送请求并启动while循环,直到成功轮询结果,例如: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
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
参数。有了这些参数和子任务的使用,我认为我可以很好地解决这个问题。谢谢你的意见。