等待任务中的外部Web服务的结果

时间:2011-09-22 12:16:48

标签: python celery

我需要编写一堆任务,其中每个任务都需要查询外部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 ]

虽然这肯定有效但对我来说似乎非常粗糙,我也阻止了芹菜工作者直到结果被调查。有没有更好的方法?

3 个答案:

答案 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)