如何在执行芹菜任务时停止任务并在一段时间后继续执行



我有以下芹菜任务(简化),它与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

相关内容

  • 没有找到相关文章

最新更新