通过代码:
@celery.task()
def some_recursive_task():
# Do some stuff and schedule it to run again later
# Note that the next run is not scheduled in a fixed basis, like crontabs
# but based on history of some object
# Actual task is found here:
# https://github.com/rafaelsierra/cheddar/blob/master/src/feeds/tasks.py#L39
# Then it call himself again
countdown = bla.get_countdown()
some_recursive_task.apply_async(countdown=countdown)
此任务将在接下来的 10 分钟和 12 小时内运行,但此任务还调用另一个现在应该运行的任务,一个用于下载内容,另一个用于解析它。
问题是数据库上的每条记录都会调用主函数,假设有几百个任务正在运行,但是考虑到这些任务平均每隔几个小时运行一次,任务的数量并不是什么大问题。
当我尝试使用单个工作人员运行它时,问题就开始了,当我启动工作人员时,我把它运行所有队列并设置 8 个并发工作人员,然后它开始开始确认任务,但似乎不管任务设置在多远的将来,工作人员将获得它并等待其预定的运行,这意味着该工作人员在此之前被锁定。
我知道我可以将另外两个函数拆分为不同的队列,我已经这样做了,但我担心工作人员会确认任务提前 12 小时运行,而不会在 30 分钟内运行它应该运行的任务。
工作人员不应该在时间之前忽略计划任务并运行那些没有时间就延迟的任务吗?
我不认为或不知道如何定期任务是一种解决方案。