Python 如何在一定时间后调用回调函数
我使用Twisted和Txmongo lib。 在下面的函数中,我想在5秒后调用cancelTest()。但代码不起作用。我怎样才能让它工作Python 如何在一定时间后调用回调函数,python,twisted,Python,Twisted,我使用Twisted和Txmongo lib。 在下面的函数中,我想在5秒后调用cancelTest()。但代码不起作用。我怎样才能让它工作 from twisted.internet import task def diverge(self, d): if d == 'Wait': self.flag = 1 # self.timeInit = time.time() clock = task.Clock() for i
from twisted.internet import task
def diverge(self, d):
if d == 'Wait':
self.flag = 1
# self.timeInit = time.time()
clock = task.Clock()
for ip in self.ips:
if self.factory.dictQueue.get(ip) is not None:
self.factory.dictQueue[ip].append(self)
else:
self.factory.dictQueue[ip] = deque([self])
# self.factory.dictQueue[ip].append(self)
log.msg("-----------------the queue after wait")
log.msg(self.factory.dictQueue)
###############################HERE, this does not work
self.dtime = task.deferLater(clock, 5, self.printData)
#############################
self.dtime.addCallback(self.cancelTest)
self.dtime.addErrback(log.err)
else:
self.cancelTimeOut()
d.addCallback(self.dispatch)
d.addErrback(log.err)
def sendBackIP(self):
self.ips.pop(0)
log.msg("the IPs: %s" % self.ips)
d = self.factory.service.checkResource(self.ips)
d.addCallback(self.diverge) ###invoke above function
log.msg("the result from checkResource: ")
log.msg()
通常,
reactor.callLater()
是您想要的函数。因此,如果5秒钟后需要调用函数,则代码如下所示:
from twisted.internet import reactor
reactor.callLater(5, cancelTest)
一件奇怪的事情是,您的任务。稍后的实现也应该可以工作。但是,如果没有看到更多您的代码,我想我只能说这很奇怪:)
工具书类
-
你几乎每件事都做对了;你只是没有把钟的部件弄对
twisted.internet.task.Clock是iActorTime的一种确定性实现,主要用于单元/集成测试,以从代码中获得确定性输出;你不应该在生产中使用它
那么,在生产中应该使用什么呢反应堆!事实上,所有生产反应器实现都实现了IReactorTime接口
只需使用以下导入和函数调用:
from twisted.internet import reactor
# (omissis)
self.dtime = task.deferLater(reactor, 5, self.printData)
只是一些旁注:
在代码段上方的文本中,您表示希望在五秒钟后调用cancelTest,但在代码中您实际调用了printData;当然,如果printData只是打印一些东西,不引发并返回立即值,这将导致cancelTest函数在之后立即执行,因为它是一个链式callcack但是如果您想真正100%确定,您应该稍后调用cancelTest,而不是printData
而且,我不明白这是否是一种“超时”;请注意,在所有情况下都会触发此类回调,即使测试时间少于5秒。如果需要可取消的任务,则应直接使用reactor.callLater;这不会返回您可以使用的延迟时间,但会让您取消计划的调用。这一点也不奇怪:-)Clock()是iActorTime的一个确定性模拟实现,因此除非调用Clock.advance(5),否则时钟永远不会移动。谢谢您的回答。我仍然有疑问:因为这个程序使用internet.TCPServer和其他服务模块,所以反应堆实际上在幕后,如果我像你说的那样使用反应堆,它会是两个反应堆吗?我该怎么办呢?反应堆实际上是一种模式,在POSA2的书中有很好的描述:只有一个反应堆。在Twisted中,如果您在Linux下,您可能正在使用SelectReactor或EPollReactor。当第一次导入这样的模块时,如果尚未安装,它将实例化默认的reactor:因此,在后台使用reactor的是TCPServer,而不是相反。在需要特定的实现之前,您可以安全地忽略它。