我有以下芹菜任务(简化),它与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
我希望能够在命中率限制时暂停一段时间,并从剩下的点恢复执行。(或丢下错误并重试任务,传递其他夸尔格斯)。如何完成?
捕获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分钟(Twitter API速率限制)
您可以在芹菜文档中找到更多有关重试的信息:
http://docs.celeryproject.org/en/latest/userguide/tasks.html#Retrying