我有以下芹菜任务(简化),它与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 :(得分: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=True
,并在您的任务定义中添加了self
,以便在获得429时能够self.retry
。
retry
中的使用参数countdown
来说明何时需要重试任务(以秒为单位)。在这里,我选择了15分钟(推特API速率限制)
您可以在celery文档中找到有关重试的更多信息:
http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying