我有一个简单的芹菜任务,如下所示:
@app.task(bind=True)
def dumb_task(self):
print "DUMB to sleep"
time.sleep(10)
print "DUMB awakes"
self.retry(max_retries=10000, countdown=15)
在任务的回溯中,我在 15 秒内获得了成功的重试异常。但是,当 15 秒过去时,不会执行任何任务。我尝试了很多东西,以至于我超级迷失。
这是芹菜工人的日志,如果有机会了解发生了什么:
[2015-01-20 13:42:03,332: WARNING/Worker-4:2] DUMB awakes
[2015-01-20 13:42:03,347: DEBUG/Worker-4:2] Start from server, version: 0.9, properties: {u'information': u'Licensed under the MPL. See http://www.rabbitmq.com/', u'product': u'RabbitMQ', u'copyright': u'Copyright (C) 2007-2012 VMware, Inc.', u'capabilities': {u'exchange_exchange_bindings': True, u'consumer_cancel_notify': True, u'publisher_confirms': True, u'basic.nack': True}, u'platform': u'Erlang/OTP', u'version': u'2.8.4'}, mechanisms: [u'PLAIN', u'AMQPLAIN'], locales: [u'en_US']
[2015-01-20 13:42:03,348: DEBUG/Worker-4:2] Open OK!
[2015-01-20 13:42:03,348: DEBUG/Worker-4:2] using channel_id: 1
[2015-01-20 13:42:03,349: DEBUG/Worker-4:2] Channel open
[2015-01-20 13:42:03,355: INFO/Worker-4] Task gui.tasks.dumb_task[806d7cbf5d00-4886-a715-e15fd9038b85] retry: Retry in 15s
[2015-01-20 13:42:03,356: INFO/Worker-3] Received task: gui.tasks.dumb_task[806d7cbf-5d00-4886-a715-e15fd9038b85] eta:[2015-01-20 13:42:18.334884+01:00]
还有芹菜花的追溯:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 437, in __protected_call__
return self.run(*args, **kwargs)
File "/home/revuelta/web/piar/web/gui/tasks.py", line 59, in dumb_task
self.retry(max_retries=10000, countdown=15)
File "/usr/local/lib/python2.7/dist-packages/celery/app/task.py", line 680, in retry
raise ret
Retry: Retry in 15s
但是,当时间过去时,不会重试任何任务。
我认为问题可能出在系统和芹菜使用的时区上......
TIME_ZONE = 'Europe/Madrid'
CELERY_TIMEZONE = 'Europe/Madrid'
Debian 中的 date 命令显示下一个:
mar ene 20 13:49:25 CET 2015
这是日志中的相同 TZ。
任何帮助,不胜感激。
谢谢。
我们以这种方式使用任务重新创建并且工作正常:
@app.task
def fetch_followers(*args, **kwargs):
try:
# do some stuff here
except RateLimitError as e:
fetch_followers.retry(countdown=60)
return False
请注意,我们使用任务名称 fetch_followers
而不是 self
显式执行.retry()
。我不确定这是否是原因,但也许它有所帮助。
另一种可能性是,任务在实际执行.retry()
之前会引发一些超时,这就是新任务不排队的原因。
顺便说一句,您使用的是哪个经纪人?您是否能够查看在达到超时时新任务是否在代理中排队?
我希望它有所帮助。