Python 正确配置芹菜以重试工作任务

Python 正确配置芹菜以重试工作任务,python,django,celery,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秒过去时,不会执行任何任务。我尝试了太多的东西,都快迷路了 这是芹菜工人的日志,如果有

我有一个简单的芹菜任务如下:

@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
请注意,我们执行的是
.retry()
,明确使用任务名
fetch\u followers
,而不是
self
。我不确定这是否是原因,但也许有帮助

另一种可能是任务在实际执行
.retry()
之前引发了一些超时,这就是新任务未排队的原因

顺便问一下,你用的是哪家经纪公司?当达到超时时,您是否能够看到新任务是否在代理中排队


我希望它能有所帮助。

这不应该是
raise dumb_任务。重试(倒计时=15)
?我尝试过,没有任何更改,如果重试调用后有行,raise会强制代码不执行,但重试调用的执行没有任何更改。@Antonicschristofides
retry
方法已经引发,除了代码美学之外,你不需要在前面加上“
提升”
。如果你在开发环境中工作,并且你有“
芹菜任务”\u ALWAYS\u Earner=True
和“
芹菜任务”\u Earner\u Propagations=True”
?当任务绑定到应用程序时,你可以使用自选词来重试自己,但是如果我这样做的话,你可以将
dumb_task.retry(…)
这是一样的,这个任务是由一个工作者接收的(如该工作者的日志所示),但它从未执行过。此外,重试不一定要在except子句中。我正在使用RabbitMQ作为代理,但是我没有办法查看消息是否已排队,因为在MQTT中看到消息会消耗它…只需停止队列中正在消耗的工作进程(这样任务就不会立即被消耗)并检查RabbitMQ仪表板。你应该有一个任务在那里排队。如果你没有配置仪表板,你也可以在终端中使用
rabbitmqctl list_queues
。没有
[2015-01-20 13:42:03356:INFO/Worker-3]收到的任务:gui.tasks.dumb_任务[806d7cbf-5d00-4886-a715-e15fd9038b85]eta:[2015-01-20 13:42:18.33484+01:00]
是否表示工作人员从队列中收到消息?