对 Python Celery eta 的限制?

ofe*_*fey 1 python asynchronous celery celery-task

Celery 对任务的 eta 有限制吗?我想foo在 12 天后执行该方法,Celery 会不会有问题?或者我需要为这么长的 eta 配置任何 Celery 设置吗?

next_run = datetime.now() + timedelta(days = 12)
foo.apply_async(args=[], eta = next_run)
Run Code Online (Sandbox Code Playgroud)

blu*_*cat 5

这取决于您使用的代理和一些配置,例如visibility_timeout.

当设置了 ETA 的任务入队时,它会由工作人员尽快获取,而不是在 ETA 时获取。worker 持有任务直到 ETA 并执行它。工人在处理任务时确认经纪人;所以代理知道什么时候可以安全地删除任务消息。

一些代理,如 Redis 和 SQS,认为如果某个任务在一段时间内没有被工作人员确认就会丢失,这称为visibility_timeout。在这种情况下,它允许另一个工作人员获取任务消息。

回到您的情况,如果您使用 Redis,它的默认visibility_timeout值为 1 小时,则将任务延迟 12 天可能最终会多次执行该任务,例如 12 * 24 次,具体取决于您的工作人员数量。

增加到visibility_timeout12 天以上可能很诱人。请注意,它有效地禁用了确认机制,这是有充分理由的。

我建议您使用以 间隔运行的 cron 任务visibility_timeout来扫描应该很快执行的任务,并将它们排入实际的 ETA 队列。

参考: