如何使用Celery延迟任务?

7 投票
2 回答
4522 浏览
提问于 2025-04-16 01:59

这里不是在讨论delay这个方法。

我想要能够根据任务的任务ID,随时获取一个任务,并在它执行之前改变它的预计完成时间(ETA)。

现在我只能取消这个任务,然后重新安排一个。这很麻烦,特别是当这个安排的过程涉及很多内容的时候。

2 个回答

1

假设你正在使用django-celery和数据库调度器的PeriodicTask,你需要修改你的PeriodicTask的时间间隔或者定时任务设置,然后保存它。如果你的任务是通过时间间隔来定义的,你需要修改一下last_run_at这个属性。

你可以通过以下方式使用数据库调度器来运行celerybeat:

python manage.py celerybeat -S djcelery.schedulers.DatabaseScheduler
1

你应该在celery或任务队列之外存储一些“暂停”的值。我在使用celery的邮件发送功能时就是这样做的。我可以通过在memcache或mysql中设置值来暂停系统的某些部分。然后,任务在执行之前会先查询这些外部资源。如果任务需要暂停,它就会调用task.retry(),这样就会进入重试延迟时间等流程。

撰写回答