美文网首页
Twisted中的定时器

Twisted中的定时器

作者: SlashBoyMr_wang | 来源:发表于2019-01-10 14:47 被阅读0次

一、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.任务之间相互独立,以至于任务内部的交互很少。

相关文章

  • Twisted中的定时器

    一、Twisted的延迟调用 Twisted的延迟调用也可称为一次定时,它可以人为规定多长时间后去让程序执行,先来...

  • Python学习八十七天:使用异步的twisted框架写入数据

    1.twisted框架介绍 Twisted是用Python实现的基于事件驱动的网络引擎框架; Twisted支持许...

  • twisted-client-3 简单理解

    最近在看twisted,直接在gitbook中找了一本twisted的书籍,虽然书中对代码进行了详细的解释,但是其...

  • Learning Twisted

    Twisted Introduction Twisted Web in 60 seconds: Index Twi...

  • Python-Error

    > twisted.web >>> import scrapyfrom twisted.web import ht...

  • Windows&&Ubuntu安装Python爬虫Scrapy框

    Windows环境下的Scrapy创建 一、安装 Twisted 模块 ​ 1、Twisted模块下载...

  • iOS进阶-谈谈定时器

    目录 iOS提供定时器API 定时器开发中的坑 一、 iOS提供定时器API 二、定时器开发中的坑 2.1、必须办...

  • IOS常见问题分析

    1、定时器问题 1) 定时器在子线程中不启动: 子线程中启动定时器的方法:

  • Twisted

    本文章通过实际例子和用Twisted实现一个类似QQ那样的聊天室来逐步学习Twisted 一、稍微来点基础 首先,...

  • twisted

    Twisted Defer and DeferredQueue

网友评论

      本文标题:Twisted中的定时器

      本文链接:https://www.haomeiwen.com/subject/jnqarqtx.html