2016-11-30 86 views
1

我有以下celery任务(简化),它与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错误代码:

@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 

请注意,我在你的任务的定义添加在你的任务装饰bind=Trueself作为参数能够做到self.retry当你得到一个429.

retry使用参数countdown来说什么时候你想要重试任务(以秒为单位)。在这里,我选择了15分钟(Twitter的API速率限制)

您可以找到有关重试更多的相关信息的芹菜文档中:

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

相关问题