如何在执行celery任务时停止它并在一段时间后继续执行?

时间:2016-11-30 12:01:25

标签: python django python-3.x 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)。如何实现这一目标?

1 个答案:

答案 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