2016-11-30 3 views
1

Twitter API와 상호 작용하는 다음과 같은 샐러리 작업 (간체)이 있습니다.셀러리 작업이 실행되는 동안 셀러리 작업을 중지하고 잠시 후 실행을 계속하는 방법은 무엇입니까?

@app.task 
def get_followers(screen_name, **kwargs): 
    cursor = kwargs.get('cursor', -1) 
    followers = kwargs.get('followers', []) 
    while True: 
     response = twitter_api.call('followers', 'ids', screen_name=screen_name, cursor=cursor) 
     if response.status_code == '429': # RATE LIMIT EXCEEDED 
      # do something here 

     cursor = response.json()['next_cursor'] 
     if cursor == 0: # we're done 
      break 
    return followers 

나는 속도 제한 명중 몇 시간 동안 작업을 일시 정지하고, 중단 점에서 실행을 재개 할 수 있어야합니다. (또는 오류를 던지고 추가 kwargs 전달 작업을 다시 시도하십시오). 이것이 어떻게 성취 될 수 있는가?

+0

확인이 : http://python-twitter.readthedocs.io/en /latest/rate_limits.html – MYGz

+0

그리고 이것 : https://dev.twitter.com/rest/public/rate-limiting – MYGz

+0

@ mohammad-yusuf-ghazi이 페이지들에 대해 알고 있습니다. 저는 셀러리 부분에 특별히 관심이 있습니다. . 내가 이해하는 한, 'sleep_on_rate_limit = True'가 있고 속도 제한을 초과하면 작업은 "잠깐 들러서"다음 15 분 동안 작업자 공간에서 공간을 차지할 것입니다. 그렇지 않습니까? –

답변

2
당신이 429 오류 코드 잡을 때 당신은 당신의 작업을 다시 시도 할 수 있습니다

: self.retry을 할 수 있도록 내가 당신의 작업의 정의에 매개 변수로 작업 장식에 bind=Trueself을 추가

@app.task(bind=True) 
def get_followers(self, screen_name, **kwargs): 
    cursor = kwargs.get('cursor', -1) 
    followers = kwargs.get('followers', []) 
    while True: 
     response = twitter_api.call('followers', 'ids', screen_name=screen_name, cursor=cursor) 
     if response.status_code == '429': 
      # RATE LIMIT EXCEEDED 
      self.retry(countdown=15*60) 

     cursor = response.json()['next_cursor'] 
     if cursor == 0: # we're done 
      break 
    return followers 

countdown을 사용하면 작업을 재 시도 할 시간 (초)을 지정할 수 있습니다. 여기 당신은 셀러리 설명서에 재 시도에 대한 자세한 정보를 정기적으로 찾을 수 있습니다

15 분 (트위터 API 속도 제한을) 선택 :

http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying

관련 문제