Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一定时间后调用回调函数_Python_Twisted - Fatal编程技术网

Python 如何在一定时间后调用回调函数

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

我使用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 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,而不是相反。在需要特定的实现之前,您可以安全地忽略它。