文章摘要
GPT 4
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
投诉

cron的任务堆积问题

本篇为记录搜索引擎项目遇到的问题

cron是什么?

Cron是一个实用程序,用于在特定的时间自动执行重复任务。在Linux中,常用 cron 服务器来完成这项工作,以下是Cron的工作原理:

如果想稍后执行特定任务一次,可以使用其他命令。但是,对于重复性任务,cron是完美的解决方案。Cron是一个守护进程,这意味着它在后台运行以执行非交互式任务。类似Windows后台进程中的服务。

cron的运行机制

不过,Cron 不会自动等待上一个任务完成后再执行下一个任务。Cron 仅负责按计划触发任务,不会管理任务之间的依赖关系或执行状态。

这也就导致我们不得不注意在使用cron重复运行任务的时候,会出现的任务堆积的问题。

如果上一次的任务在时间间隔内没有执行完成的话,cron不会等待,会再次启动一个任务。时间长了之后便会造成程序的崩溃。

如何解决?

我们最先想到的最简单粗暴的方式便是延长等待时间:

这种方式看起来不是很优雅,因为我们不能清除的知道任务会执行多久,意味的延长过多的时间影响任务执行效率。那么我们是否可以通过多次运行程序衡量时间呢,正常情况是可以的,不过在我写的搜索引擎项目中,任务有访问数据库的部分,这部分会因为锁的占用而延迟,这是一种动态的时间不好估计,因此这个方案不是很好

那么对于任务设置超时时间怎么样呢?

如果我们的循环时间间隔是10s,而一个任务的超时时间也是10s的话就不会出现任务堆积的情况,不过问题仍然没有改变,我们无法确定一个任务的执行时间。因此这个方法也不是很优雅。

所以我最终的解决方案是:

在每次任务开始之前检查这个任务是否在运行,如果在运行就跳过本次任务的启动。

通过一个bool变量taskInProgress表示任务的运行状态,运行开始时候taskInProgress置为true,运行结束时候改为false,需要注意考虑程序崩溃的情况,确保崩溃也可以将taskInProgress状态改为false。

在每次程序运行时候检查taskInProgress变量的值,如果为true则跳过本次任务,如果为false则开始任务。

这样的话其实间隔时间可以设置的小一点,通过taskInProgress确保了始终只有一个任务在运行。