Python 如何为芹菜任务设置自定义上下文
我一直在用芹菜和Django,一切都很顺利,除了我需要重试失败的任务 它引发异常,并且不再发送任务(根据我在芹菜花中看到的) 下面是我如何声明任务的Python 如何为芹菜任务设置自定义上下文,python,django,heroku,rabbitmq,celery,Python,Django,Heroku,Rabbitmq,Celery,我一直在用芹菜和Django,一切都很顺利,除了我需要重试失败的任务 它引发异常,并且不再发送任务(根据我在芹菜花中看到的) 下面是我如何声明任务的 # Enqueue this on "my_cool_queue", retry it no more than ten times and delay the retries by 10 seconds @celery.task(queue='my_cool_queue', max_retries=10, default_retry_delay=
# Enqueue this on "my_cool_queue", retry it no more than ten times and delay the retries by 10 seconds
@celery.task(queue='my_cool_queue', max_retries=10, default_retry_delay=10)
def task(arg1, arg2):
try:
# do some things with arg2 and arg2
except suds.WebFault, fault:
task.retry(exc=fault, args=[arg1, arg2], queue='my_cool_queue')
我在用这个命令运行芹菜
python manage.py celeryd --concurrency=2 -B -Q my_cool_queue,cron -l INFO
我有两个队列,一个是放置所有用户生成任务的“酷”队列,另一个是放置所有计划任务的cron队列
我错过了什么
编辑:
通过调试芹菜的重试方法,我发现它并没有重试任务
因为它接收默认上下文,其中“called_directly”参数为True
因此,此方法的前几行如下所示:
# Not in worker or emulated by (apply/always_eager),
# so just raise the original exception.
if request.called_directly:
maybe_reraise() # raise orig stack if PyErr_Occurred
raise exc or RetryTaskError('Task can be retried', None)
问题可能是“我如何才能优雅地改变这一点”,所以我不必这么做
直接写在任务上:
task.request.called_directly = False
非常感谢您。首先不应该设置此选项。您的问题不是如何更改它,而是如何在没有此属性的情况下调用任务 你是否
。延迟你的任务?您肯定没有使用“急切”模式吗
你正在运行哪个版本的芹菜?你听到了正确的异常吗?我尝试了异常、错误,得到了相同的行为:-(您似乎遇到了一个错误,名称“task”不再是当前正在运行的任务。您使用的代理是什么,在哪个平台上?开发版本(3.1版)通过引入@app.task(bind=True)def task(self):self.retry(…)确保不再发生这种情况。)
lol,非常感谢@asksol我在Linux上使用芹菜3.0.23、rabbitmq和所有东西。是的,我使用apply_async()调用我的任务,使用芹菜3.0.23并使用默认配置,我认为默认情况下“aways eager”是错误的