Python 如何在执行芹菜任务时停止它,并在一段时间后继续执行?
我有以下芹菜任务(简化),它与twitterapi交互Python 如何在执行芹菜任务时停止它,并在一段时间后继续执行?,python,django,python-3.x,celery,Python,Django,Python 3.x,Celery,我有以下芹菜任务(简化),它与twitterapi交互 @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=scre
@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
我希望能够在达到速率限制时暂停任务一段时间,并从停止点恢复执行。(或抛出错误并重试任务,传入其他KWARG)。如何实现这一点?当您捕获到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
作为任务定义中的参数,以便能够执行self。收到429后重试
在重试
中,使用参数倒计时
说明您希望何时重试任务(以秒为单位)。这里我选择了15分钟(twitter API速率限制)
您可以在芹菜文档中找到有关重试的更多信息:
检查这个:还有这个:@mohammad yusuf ghazi我知道这些页面,我对这里的芹菜部分特别感兴趣。据我所知,如果我有sleep\u on\u rate\u limit=True
并且超过了速率限制,那么任务将“挂在那里”,在接下来的15分钟内消耗工作池中的空间,不是吗?那么您必须对api进行异步调用。检查有关此问题的链接@穆罕默德·优素福·加齐(mohammad yusuf ghazi)对不起,但我不明白这与我的问题有什么关系。我对芹菜任务有问题,而不是API调用。此外,我使用的是django而不是tornado(这仅在问题的标记部分提到,但它应该与假设的解决方案无关)