正确配置Celery以重试任务正常工作

时间:2015-01-20 12:50:44

标签: python django celery

我有一个像这样简单的芹菜任务:

@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是相同的。

感谢任何帮助。

谢谢。

1 个答案:

答案 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()之前提高了一些超时,这就是新任务没有排队的原因。

顺便说一下,你在使用哪个经纪人?您是否能够在达到超时时查看代理中是否有新任务排队?

我希望它有所帮助。