按代码:
@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小时内运行,但此任务还会调用另一个应立即运行的任务,one for downloading内容和其他to parse it。
问题是为数据库中的每一条记录调用了main函数,让我们假设有几百个任务在运行,但是,考虑到这些任务平均每隔几小时运行一次,任务量就没什么大不了的。 / p>
当我尝试使用单个工作程序运行此问题时启动问题,当我启动工作程序时,我将其运行所有队列并设置8个并发工作程序,然后它开始开始确认任务,但似乎,无论将来任务设置多远,工作人员都会得到它并等待其计划的运行,这意味着此工作人员在此之前一直处于锁定状态。
我知道我可以将其他两个功能分成不同的队列,我已经做过,但我担心的是工作人员会承认提前12小时运行的任务,并且不会在30分钟内运行应该运行的任务。 / p>
工作人员不应该忽略计划任务直到它的时间并运行那些没有时间延迟的计划任务吗?
我不认为,或者不知道如何,periodic tasks是一种解决方案。
答案 0 :(得分:2)
见第5点和第5点。 6 there。请记住,countdown
与任务的eta
参数没有区别。
总之你是对的。单个工作人员(或任何数量的工作人员)不应阻止计划(eta
或countdown
)任务。
你怎么知道工人被锁了? 计划任务是从队列中预取的,但在执行之前不会被确认。
另外,请记住,所有计划任务都会保留在RAM中,直到执行完毕为止。你希望它们尽可能轻。根据我的理解,预定任务不会传递大块数据,可能只有一些 URI ,所以这应该不是问题。
您粘贴的链接返回404.您确定cheddar
不是私有存储库吗?