限制Python Celery eta?

时间:2015-12-16 13:46:56

标签: python asynchronous celery celery-task

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

next_run = datetime.now() + timedelta(days = 12)
foo.apply_async(args=[], eta = next_run)

1 个答案:

答案 0 :(得分:2)

这取决于您使用的经纪商和一些配置,例如visibility_timeout

当具有ETA设置的任务入队时,它由工作人员asAP而不是ETA提取。工作人员将任务保留到ETA并执行它。当工作人员处理任务时,工作人员会对其进行处理;因此,经纪人知道何时可以安全删除任务消息。

一些经纪人,比如Redis和SQS,如果工作人员在一段时间内没有得到承认,就会将任务丢失,称为visibility_timeout。在这种情况下,它允许其他工作人员接收任务消息。

回到你的情况,如果你使用Redis,其默认visibility_timeout为1小时,延迟任务12天可能会多次执行任务,例如12 * 24次,具体取决于你的工人数量。

visibility_timeout增加到超过12天可能很诱人。请注意,它有效地禁用了确认机制,该机制存在的原因很充分。

我建议你使用一个以visibility_timeout为间隔运行的cron任务来扫描即将执行的任务,并将它们排列在实际的ETA中。

参考文献: