Celery对任务的eta有限制吗?我想在12天后执行方法foo
,Celery对此会有问题吗?或者我需要为这么长的eta配置任何Celery设置吗?
next_run = datetime.now() + timedelta(days = 12)
foo.apply_async(args=[], eta = next_run)
这取决于您使用的代理和一些配置,如visibility_timeout
。
当设置了ETA的任务进入队列时,它会由工作人员尽快获取,而不是在ETA。工人将任务保持到ETA,然后执行它。工作人员在代理处理任务时对其进行确认;因此代理知道何时可以安全地删除任务消息。
一些代理,如Redis和SQS,如果工作人员在一段时间内没有确认任务,就会认为该任务丢失,称为visibility_timeout
。在这种情况下,它允许另一个工作者接收任务消息。
回到您的案例,如果您使用的是Redis,其默认visibility_timeout
为1小时,则将任务延迟12天可能会导致多次执行任务,如12*24次,具体取决于您的员工数量。
将visibility_timeout
增加到12天以上可能是诱人的。请注意,它有效地禁用了确认机制,这是有充分理由的。
我建议您使用以visibility_timeout
为间隔运行的cron任务来扫描应该很快执行的任务,并在它们的实际ETA将它们排队。
参考:
- 可见性超时
- 确认