2011-03-17 43 views
3

編寫與服務進行通信的芹菜任務時,正確的方法是什麼?這些任務與費率限制有關並且有時在很長一段時間內缺失(無響應)?與Twitter交流的芹菜任務

我必須使用任務重試嗎?如果服務缺少太多時間會怎麼樣?有沒有辦法將這些任務存儲以便在較長時間後執行以後執行?

如果這是一項長期任務中的子任務會怎麼樣?

回答

2

首先,我建議你設置套接字超時以避免長時間等待響應。 比你可以捕獲套接字TimeOutException並在這種特殊情況下重試時間很長,如15分鐘。 無論如何,通常我會使用增量百分比遞增的incrementalRetry,這會增加每次重試任務的時間,這在您編寫依賴於可以長時間使用的外部服務的任務時非常有用。 您可以在任務設置大量的重試的像50,比通過使用var

#20 seconds 
self.default_retry_delay = 20 

設置標準重試時間後,你可以爲你的任務實現這樣的方法

def incrementalRetry(self, exc, perc = 20, args = None): 
    """By default the retry delay is increased by 20 percent""" 
    if args: 
     self.request.args = args 

    delay = self.default_retry_delay 

    if self.request.kwargs.has_key('retry_deleay'): 
     delay = self.request.kwargs['retry_deleay'] 

    retry_delay = delay+round((delay*perc)/100,2) 
    #print "delay"+str(retry_delay) 

    self.retry(self.request.args, 
       self.request.kwargs.update({'retry_deleay':retry_delay}), 
       exc=exc,countdown=retry_delay, max_retries=self.max_retries) 

如果這是一項長期任務的子任務會怎麼樣?

如果您不需要的結果您可以通過使用task.delay啓動它在異步模式下(參數= []) 一個很好的功能還允許您推出不同的任務,後任務組一切都完成了,你可以在你工作流程中的其他東西。