我有一个像这样简单的芹菜任务:
@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秒过去时,没有执行任务。我已经尝试了很多我失去的东西。
这是Celery工作人员的日志,如果有机会得到正在发生的事情:
[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
但是当时间结束时,不会重试任务。
我认为问题可能出在系统和Celery使用的时区......
TIME_ZONE = 'Europe/Madrid'
CELERY_TIMEZONE = 'Europe/Madrid'
Debian中的日期命令显示下一个:
mar ene 20 13:49:25 CET 2015
日志中的TZ是相同的。
感谢任何帮助。
谢谢。
答案 0 :(得分:0)
我们正在以这种方式使用任务重新配置并且正常工作:
@app.task
def fetch_followers(*args, **kwargs):
try:
# do some stuff here
except RateLimitError as e:
fetch_followers.retry(countdown=60)
return False
请注意,我们使用任务名称.retry()
而不是fetch_followers
明确地执行self
。我不确定这是不是原因,但也许有帮助。
另一种可能性是任务在实际执行.retry()
之前提高了一些超时,这就是新任务没有排队的原因。
我希望它有所帮助。