twisted 定时处理(递归调用callLater)(protocol内)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

补注 2014-4-7: 这个方法作废,递归调用不可取

在protocol内使用--通过递归调用,同时使用异步的callLater,实现定时处理,***并通过设置timeout参数实现立即触发处理 ->>如果调用policies.TimeoutMixin.setTimeout(None)就立即触发执行callLater的函数

# -*- coding: utf-8 -*-

"""代码片段
通过递归调用,同时使用异步的callLater,实现定时处理
"""
class FPStatProtocol(policies.TimeoutMixin, protocol.Protocol): # from twisted.protocols import policies
    def connectionMade(self):
        self.msg("connectionMade")
        self.ping() # 心跳
        
    def ping(self):                                  #*1
        self.msg('PING')
        self.setTimeout(20)
        self.sendMessage(0x00) # 心跳消息
        self.dcPing = self.callLater(60, self.ping)  #*2 这句是异步递归调用,延时60s,其实也就是reactor.callLater(interval, fun), 用这个也行

    def sendMessage(self, cmdno, data='', version=0x01):
        data = ST_2sBBH.pack("TC", version, cmdno, len(data)) + data
        self.write(data)

.和上面一样, 下面完整的定时器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os, sys

try:
    open("./var/run/mytask.pid", "w").write("%s\n" % os.getpid())
except Exception as e:
    sys.exit(repr(e))
    
from twisted.internet import reactor

import functools

# 定时调用
def ping(timeout):
    # do something 
    print "..."
    cb = functools.partial(ping, timeout=timeout)
    reactor.callLater(timeout, cb)

if __name__ == "__main__":
    ping(timeout=5)
    reactor.run()

转载于:https://my.oschina.net/1123581321/blog/160654

你可能感兴趣的:(twisted 定时处理(递归调用callLater)(protocol内))