tornado(epoll底层),apscheduler 异步IO封装库

原文链接: http://www.it165.net/os/html/201310/6453.html

按照我的测试,sched和timer不适合做循环的计划任务,当然你可以在sched调用函数的时候,用while sleep的方法实现也是靠谱的。。。。

感觉python应该有靠谱点的计划任务模块,问了下朋友,他们现在用的是 APScheduler

一个很牛逼的库~ 已经测试过了

特定时间的运行:


1. from apscheduler.scheduler import Scheduler
2. sched = Scheduler()
3. sched.daemonic = False
4. def job_function(text):
5. print text
6. from datetime import datetime
7. job = sched.add_date_job(job_function, datetime(2013, 10, 11, 02, 36, 00), ['Hello World'])
8. sched.start()

间隔的运行:

 

01. from apscheduler.scheduler import Scheduler
02. import time
03. sched = Scheduler()
04. sched.daemonic = False
05. def job_function():
06. print "wan si ni"
07. print time.strftime('%Y%m%d%H%M %S')
08. sched.add_interval_job(job_function,  seconds=3)
09. sched.start()

循环3s,ok !!!

024845422.jpg

 

哈,我简单说了下 python下实现计划任务的几种方式,本来要聊tornado,结果搞到标准库了。

晕,赶紧说正题:

 

python的web框架中tornado是强大的,他的IOLoop类是Tornado的边缘触发事件驱动模型,在Linux平台下面封装的是epoll模型。这就是他的异步模式的基础。

 

要是合成到tornado的ioloop的话,我启动一个主程序,不仅把相应的脚本按照间隔调度跑起来,主web也可以访问啦。

 

用python实现计划任务,除了python自带的shed,timer之外,我能想到的就是开多线程,自己去处理每个任务以及时间间隔。还有就是tornado的ioloop。

 

精力有限,现在还没有做出像linux系统下的crontab那样的工具。

我想到的思路是 配置文件可以就是crontab的时间语法,或者是咱们用yaml,configparser。程序启动的时候,开一个线程,专门关注这些个数据,对于任务和时间都要采用全局的变量,这些个函数进入主体的时候,先把global变量加载进来,然后大家就懂啦。。。。

下面是我用tornado ioloop实现的方法:


01. from tornado import web, ioloop
02. import datetime
03. period = 5 * 1000   # every 5 s
04. class MainHandler(web.RequestHandler):
05. def get(self):
06. self.write('Hello Tornado')
07. def like_cron():
08. print datetime.datetime.now()
09. def xiaorui():
10. print 'xiaorui 2s'
11. def lee():
12. print 'lee 3s'
13.  
14. if __name__ == '__main__':
15. application = web.Application([
16. (r'/', MainHandler),
17. ])
18. application.listen(8081)
19. ioloop.PeriodicCallback(like_cron, period).start()  # start scheduler
20. ioloop.PeriodicCallback(lee, 3000).start()  # start scheduler
21. ioloop.IOLoop.instance().start()

结果:

025603803.jpg

再跑计划任务的时候,不影响web的访问

025826880.jpg

 

 

一眨眼,发现自己原本要写tornado,结果成大杂烩了~

微微总结下这几种计划任务的方法:

sched 就原版的例子来说,不适合做循环执行的,就单个计划任务是挺不错的。要是想做循环,不要让那个线程死掉,一直while True: 就行了

timer 同sched,不知道为啥多任务的时候,出现奇怪的问题。。。

apscheduler 这个是利器,好用,也是必须推荐使用的。

tornado 我自己觉得是很不错的,他和别的方法不一样,别人是线程,他是异步回调的方式,他背靠着epoll异步,所以很爽。

自己写 这个实现的思路,其实和sched timer,差不多的,我也有提过,就是个多线程,然后while True。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值