今天的话题是,源码分析python apscheduler计划任务的实现.  不知道为什么总是跟计划任务较真,自己一些实现了一个分布式的定时任务系统,也在博客中做过分享,但还是很喜欢看看别人是怎么写的,有什么可以借鉴的。 

新版的apscheduler 3.1.x有些太杂乱了,在3.x版本里面加了各种的运行模式,比如gevent,多进程啥的. 如果只是想看他的实现原理那我们就直接看他的经典版本2.1版本。


文章写的不是很严谨,欢迎来喷,另外该文后续有更新的,请到原文地址查看更新. http://xiaorui.cc/2016/01/10/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90python-apscheduler%E7%9A%84%E5%AE%9E%E7%8E%B0/

那可能有人问了,你丫怎么知道apscheduler的经典版是2.x? 我用apscheduler真的是很久以前了. 曾经用apschedule加tornado开发对内的计划任务系统。 


我们首先把apscheduler的代码切到2.1的commit.  

下面是apscheduler的2.1版本的测试代码,看起来很是简单。他的执行效果也会是字面理解的那种,每隔一段时间去执行tick和h5函数,不会出现堵塞情况.  

废话少说,现在开始按调度步骤来分析下apscheduler的源代码. apscheduler的代码没有用到python中的黑魔法,实现的方案也比较的中规中矩。 
主要就利用了python threading Event 和 Lock锁。

scheduler = Scheduler() 

首先我们需要实例化Scheduler类,这个类初始化了必要的一些结构.

scheduler.add_interval_job(tick, seconds=2) 

添加一条任务,apscheduler首先会把这条任务用Job来包装下。 

Apscheduler定时任务有三种,一种是add_date_job,传递是datetime类型的时间对象。  add_interval_job是循环执行, 可以秒,分,时,天,星期.  add_cron_job跟前面的add_interval_job有些像,但他的场景是单次.


总的来说把一堆的任务加入到 self._pending_jobs, self._jobstores, self._listeners之后,开始正经干活.

这个函数主要是用来判断任务是否到了执行的时间. 需要主要的是,在实例化Scheduler类的时候会创建一组默认线程数为20的线程池。这个线程池用来执行真正的任务。
如下面的意思是,时间一到就立马提交给submit去调度任务.


Apscheduler的代码解析就说到这边了,其实代码本身很是简练,值得大家好好琢磨下. 



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

分析apscheduler的定时调度器源码

前言: 跟大家在群里聊了关于apscheduler的一些话题,大家尤其对他的时间管理感兴趣, 趁现在有空,花点时间做个分享。  其实在以前是写过apschedul...

阅读全文

发表评论