一、Twisted的延迟调用
Twisted的延迟调用也可称为一次定时,它可以人为规定多长时间后去让程序执行,先来看一个小例子:
from twisted.internet import reactor # 定时任务的触发器
def func():
ret = random.random() + random.random()
print ret
return ret
reactor.callLater(2,func)
reactor.run()
如果函数的结果很重要或者想知道调用过程中发生了上面,那么deferLater 属性能够创建一个Deferred 并做一个延时调用:
from twisted.internet import reactor # 定时任务的触发器
from twisted.internet import task # 定时任务
def func(): # 任务
ret = random.random() + random.random()
print ret
return ret
ret = task.deferLater(reactor, 2, func)
def called(result): # 回调
print result
ret.addCallback(called)
reactor.run()
二、Twisted的定时循环调用(适用于后台系统开发中统计每小时、每天、每周数据等)
from twisted.internet import reactor # 定时任务的触发器
from twisted.internet import task # 定时任务
import random
DELAYTIME = 5 # 定时任务轮询周期(秒/单位)
def func(): # 任务
ret = random.random() + random.random()
print ret
return ret
if __name__ == '__main__':
# 创建定时任务,定时循环调用
task1 = task.LoopingCall(func)
# 开启定时任务,并指定定时任务的时间间隔
task1.start(DELAYTIME)
# 调动run方法,触发定时任务执行
reactor.run()
三、Twisted 的定时循环调用+logging的使用
import time
from twisted.python import log # 日志句柄
from twisted.python import logfile # 定时任务的日志文件输出位置
from twisted.internet import reactor # 定时任务的触发器
from twisted.internet import task # 定时任务
from twisted.enterprise import adbapi # 连接数据库
import random
DELAYTIME = 5 # 定时任务轮询周期(秒/单位)
def func(): # 任务
ret = random.random() + random.random()
log.msg("本次执行的输出结果为:%s"%ret)
return ret
if __name__ == '__main__':
# 开启日志,并指定日志的输出位置和日志文件名
log.startLogging(logfile.DailyLogFile('text.log', './'))
log.msg('text task started at %s...' % (time.asctime()))
# 创建定时任务,定时循环调用
task1 = task.LoopingCall(func)
# 开启定时任务,并指定定时任务的时间间隔
task1.start(DELAYTIME)
# 调动run方法,触发定时任务执行
reactor.run()
加上logging后运行文件,控制台就不再输出任何东西了,在文件的同级目录下会生成一个text.log文件,他就是任务的输出地。文件格式如下
2019-01-10 14:27:22+0800 [-] Log opened.
2019-01-10 14:27:22+0800 [-] text task started at Thu Jan 10 14:27:22 2019...
2019-01-10 14:27:22+0800 [-] 本次执行的输出结果为:0.648431382799
2019-01-10 14:27:27+0800 [-] 本次执行的输出结果为:1.11669053117
2019-01-10 14:27:32+0800 [-] 本次执行的输出结果为:0.351899097633
2019-01-10 14:27:37+0800 [-] 本次执行的输出结果为:0.915100708194
2019-01-10 14:27:42+0800 [-] 本次执行的输出结果为:0.698308490253
2019-01-10 14:27:47+0800 [-] 本次执行的输出结果为:1.18921930108
2019-01-10 14:27:52+0800 [-] 本次执行的输出结果为:0.722017953758
2019-01-10 14:27:57+0800 [-] 本次执行的输出结果为:0.717022784009
2019-01-10 14:28:02+0800 [-] 本次执行的输出结果为:0.710717516672
2019-01-10 14:31:06+0800 [-] Received SIGINT, shutting down.
2019-01-10 14:31:06+0800 [-] Main loop terminated.
在实际工作中,简单的定时任务会很常用,尤其在后台管理系统中对数据的处理时。打个比方:假如我们想统计展示每小时的网站用户访问量,我们不能每次后台展示数据时我们就对访问记录表做一次统计,那样对数据库的操作太频繁了,这时我们需要新建一张"每小时用户访问量统计表",通过一个定时任务,每一个小时我们主动做一次统计,将统计数据写入"每小时用户访问量统计表",后台数据展示时我们只需要从"每小时用户访问量统计表"中查找对应的数据就可以了。
与同步模型相比,异步模型的优势在如下情况下会得到发挥:
1.有大量的任务,因此在一个时刻至少有一个任务要运行
2.任务执行大量的I/O操作,这样同步模型就会在因为任务阻塞而浪费大量的时间
3.任务之间相互独立,以至于任务内部的交互很少。