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