2011-09-22 62 views
0

我需要编写一堆任务,其中每个任务需要查询外部Web服务。 Web服务始终以202接受状态回复,并将位置标头指向可以轮询结果的URI。此Web服务提供结果所用的时间可能从2秒到1分钟不等。我想知道什么是最好的方法来编程我的芹菜任务。现在,我发送请求并开始while循环,直到我成功轮询的结果,例如:等待任务中外部web服务的结果

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

[ continue with the rest of the task ] 

这无疑作品看起来很简陋,我和我也阻止芹菜工人,直到结果被调查。有没有更好的方法?

+0

如果您正在调用* *真正的Web网页,脚本应该只在当它得到了一个答案 - 参见[深入Python SOAP页](http://diveintopython.org/soap_web_services/index.html )一些例子 – JMax

+0

@JMax,有可能像http://docs.picloud.com/rest.html这样的东西,所以他不能这样做。 – hymloth

+0

@hymloth:感谢您指出这个网址 – JMax

回答

1

你肯定会杀死你的资源。只需查询您的外部Web服务,并保存要轮询的URI(使用缓存或分贝)。然后,您可以有一个periodic task收集结果,如果准备好了...

0

我会考虑一个芹菜任务轮询202响应提供的位置。如果它完成了,那么它会处理它,否则它会在一段时间后重新排队(或它自己的一个副本)。

对于奖励积分,如果您有很多这些任务,那么您可以在每次回复未准备好时增加轮询之间的时间。

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) 
+0

也必须记住为无限制设置适当的'max_retries':'@task(max_retries = None)'。 – asksol

+0

这就是要走的路。我没有意识到apply_async的'countdown'和'eta'参数。有了这些论点和使用子任务,我认为我可以很好地解决问题。感谢您的意见。 –