我需要编写一堆任务,其中每个任务都需要查询外部Web服务。 Web服务始终以202 ACCEPTED状态回复,并在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 ]
虽然这肯定有效但对我来说似乎非常粗糙,我也阻止了芹菜工作者直到结果被调查。有没有更好的方法?
答案 0 :(得分:1)
你肯定会杀死你的资源。只需查询您的外部Web服务并保存要轮询的URI(使用缓存或数据库)。然后您可以使用periodic task收集结果,如果准备就绪......
答案 1 :(得分:0)
我正在考虑芹菜任务,该任务轮询202响应提供的位置。如果它完成了,那么它会处理它,否则它会在一段时间后重新排队(或者自己的副本)。
对于奖励积分,如果您有很多这些任务,每次回复未准备好时,您可以增加轮询之间的时间。
答案 2 :(得分:0)
如何使用task.retry
?
@task(max_retries=100)
def poll_webservice_task(url):
result = poll_webservice(url)
if result:
return result
poll_webservice_task.retry(countdown=5)