3

通过代码:

@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 分钟内运行它应该运行的任务。

工作人员不应该在时间之前忽略计划任务并运行那些没有时间就延迟的任务吗?

我不认为或不知道如何定期任务是一种解决方案。

4

1 回答 1

2

见那里的第 5 点和第 6。请记住,这与任务的论点countdown没有什么不同。eta

简而言之,你是对的。单个工作人员(或任何数量的工作人员)不应阻塞计划的(etacountdown)任务。

你怎么知道工人被锁了?计划任务从队列中预取,但在执行之前不会被确认。

另外,请记住,所有计划任务都保存在 RAM 中,直到它们被执行。您希望它们尽可能轻。据我了解,计划任务不会传递大块数据,可能只有一些URI,所以这应该不是问题。

您粘贴的链接返回 404。您确定cheddar不是私有存储库吗?

于 2013-07-25T07:47:01.683 回答