繁体   English   中英

Django 中的芹菜超时

[英]Celery timeout in Django

在 celery 中,在不同时期共运行了 8 个任务。 它们都是事件驱动的任务。 在某个事件之后,他们被解雇了。 并且特定任务会持续工作,直到满足某些条件。

我已经注册了一个任务,它检查某些条件近两分钟。 大多数情况下,此任务运行良好。 但有时无法实现任务的预期行为。

任务签名如下:

任务.py

import time
from celery import shared_task

@shared_task()
def some_celery_task(a, b):
    main_time_end = time.time() + 120
    while time.time() < main_time_end:
        ...
        # some db operations here with given function arguments 'a' and 'b' 
        # this part of the task get execute most of the time

    if time.time() > main_time_end:
        ...
        # some db operations here.
        # this part is the part of the task that doesn't get executed sometimes

视图.py

# the other part of the view not mentioned here
# only the task invoked part 
some_celery_task.apply_async(args=(5, 9), countdown=0)

我对 celery 任务超时场景感到困惑。 这是否意味着任务将从超时处停止或将自动重试? 如果你们对超时和重试有任何明确的想法,这将是一个很大的帮助。
上面解释的场景背后的原因可能是什么? 对这个问题的任何帮助将不胜感激。 谢谢你。

检查有关 Tasks 的 Celery 文档- 基础知识记录得很好。


如果任务失败或被终止 - 任务将具有states.FAILURE状态。 除非特别编码,否则不会重试。 如果日志记录配置正确 - 在超时或其他代码异常的情况下,您可能会在日志中看到异常消息。


当超过 Celery 任务TIME_LIMIT 时- 任务立即终止:

处理任务的工人将被杀死并替换为新的。

此外, TimeLimitExceeded异常将引发类似Task handler raised error: "TimeLimitExceeded(2700)"消息Task handler raised error: "TimeLimitExceeded(2700)"


如果 Celery SOFT_TIME_LIMIT被设置并且小于TIME_LIMIT并且被超过 - 将引发SoftTimeLimitExceeded异常,允许它在任务中被SoftTimeLimitExceeded并执行清理操作。


工作人员从代理队列中消费消息(任务)时 - 代理需要知道消息已成功消费。 确认成功消耗消息工作者向 broker 确认 (ACK) 在消息未被确认之前,它不会从代理中删除,但也不能用于消费(“不可见”)。 未确认 - 消息将重新发送回代理队列,可再次使用。

重新传递未确认的消息逻辑取决于代理:

  • AMQP (RabbitMQ) 代理 - 跟踪与 worker 的连接状态,如果连接丢失 - 将消息返回到队列。

  • Redis 或 SQS 代理有自己的超时时间,如果没有收到 ACK,消息将在超时后重新发送到代理队列。


默认情况下,celery worker 会在任务开始时确认消息。

如果设置了ACKS_LATE - 工作人员仅在成功执行任务后才向代理确认。


可以通过捕获任务中的异常并将相同的任务发送回代理重新执行来重试任务 - 然后具有相同 id 的相同任务将在代理处排队。 倒计时选项允许在重试任务之前指定延迟。


Celery 任务执行和其他选项可以在settings.py 全局settings.py也可以作为每个任务的参数settings.py


推荐的方式来设计任务/逻辑,并考虑到这些事件是完全合法的,并看到它们正常(但实际上并不预期)在某个时候发生并做好准备:

  • 任务可能会失败(下一个相同的任务可能对两者都起作用,或者检查特定工作未完成并重新启动任务
  • 相同的任务可能会再次运行(幂等性
  • 类似的任务可以同时运行(锁定

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM