如何使用Celery延迟任务?
这里不是在讨论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(),这样就会进入重试延迟时间等流程。