正确配置 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 秒过去时,不会执行任何任务。我尝试了很多东西,以至于我超级迷失。

这是芹菜工人的日志,如果有机会了解发生了什么:

[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()之前会引发一些超时,这就是新任务不排队的原因。

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

我希望它有所帮助。

相关内容

  • 没有找到相关文章

最新更新