Celery对任务的eta有限制吗?我想在12天后执行方法foo
,Celery有问题吗?或者我是否需要为这么长的时间配置任何芹菜设置?
next_run = datetime.now() + timedelta(days = 12)
foo.apply_async(args=[], eta = next_run)
答案 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中。
参考文献: