补注 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()