cron的任务堆积问题
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
确保了始终只有一个任务在运行。