2016-11-30 6 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 

私はレート制限がヒットしたいくつかの時間のためのタスクを一時停止し、それが停止した時点から実行を再開できるようにしたいです。 (あるいは、エラーを投げてタスクを再試行し、追加のkwargを渡してください)。これはどのように達成できますか?

+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を行うことができるようにあなたのタスクの定義にパラメータとしてタスクデコレータとselfbind=Trueを追加

@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

関連する問題