用python的tiwsted实现一个定时器

本文详细介绍了如何利用Twisted库的callLater方法创建自定义定时器,并阐述了如何在定时器触发前进行取消操作及处理相关异常。通过解析源码和实践案例,读者将掌握在复杂应用中灵活使用定时器的技术要点。
class Timer:
    
    def __init__(self):
        self.reactor = None
        self.interval = Interval()
        self.tple = None
        self.cancel_flag = False
        
    def update_reactor(self, reactor):
        self.reactor = reactor
        
    def schedule_timer(self, sec=0, usec=0):
        self.cancel_flag = False
        self.interval.sec = sec
        self.interval.usec = usec
        self.tple = self.reactor.callLater(self.interval.sec + self.interval.usec / 1000000, self.time_out)
        
    def cancel_timer(self):
        if (self.tple != None and self.tple.called == False):
            self.tple.cancel()
            self.tple = None
        
        if (self.tple != None and self.tple.called == True):
            self.cancel_flag = True
            self.tple = None

    def time_out(self):
        if (self.cancel_flag == False):
            self.handle_timeout()
        if (self.cancel_flag == False):
            self.reactor.callLater(self.interval.sec + self.interval.usec / 1000000, self.time_out)

    def handle_timeout(self):
        pass

上网百度了半天,都没有用twsited实现一个完全意义上的定时器。网上资料好多都有callLater的用法。。却没用取消定时器的资料。。还是自已动手丰衣足食啊。

看了一下reactor的源码。callLater回返回一个DelayedCall的对像。。就是上面tple的对像。。twisted也用tple命名的。。这个DelayedCall里面有个叫cancel方法。。是取消定时器的。还要注意的是.如果这个定时器已经触发了,再cancel的话。。会报异常的。。所有cancel的时候要判断一下DelayedCall里的一个字段called..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值