2011-09-22 80 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'參數。有了這些論點和使用子任務,我認爲我可以很好地解決問題。感謝您的意見。 –