Deferred 可以按照这种方式说明:可能你在饭店中遇到过这个问题,如果你在等待自己喜欢 的桌子时,在一旁哼哼小曲。带个寻呼机是个好主意,它可以让你在等待的时候不至于孤零 零的站在那里而感到无聊。你可以在这段时间出去走走,到隔壁买点东西。当桌子可用时, 寻呼机响了,这时你就可以回到饭店去你的位置了。 一个Deferred 类似于这个寻呼机。它提供了让程序查找非同步任务完成的一种方式,而在这 时还可以做其他事情。当函数返回一个Deferred 对象时,说明获得结果之前还需要一定时间。 为了在任务完成时获得结果,可以为Deferred 指定一个事件处理器。 1、Deferred.callback,,,,,,,Deferred.errorback 当调用一个可以返回Deferred 的函数时,使用Deferred.addCallback 方法指定返回结果时调 用的函数。使用Deferred.addErrback 方法指定执行发生异常时调用的函数。 2 from twisted.internet import reactor,defer,protocol
class CallbackAndDisconnectProtocol(protocol.Protocol): def connectionMade(self): self.factory.deferred.callback("Connected!") self.transport.lostConnection()
class ConnectionTestFactory(protocol.ClientFactory): protocol=CallbackAndDisconnectProtocol def init(self): self.deferred=defer.Deferred() def clientConnectionFailed(self,connector,reason): self.deferred.errback(reason)
def testConnect(host,port): testFactory=ConnectionTestFactory() reactor.connectTCP(host,port,testFactory) return testFactory.deferred def handleSuccess(result,port): print("Connect to port %i"%port) reactor.stop() def handleFailure(failure,port): print("Error connecting to port %i: %s"%(port,failure.getErrorMessage())) reactor.stop() if name=="main": import sys if not len(sys.argv)==3: print("Usage: connectiontest.py host port") sys.exit(1) host=sys.argv[1] port=int(sys.argv[2]) connecting=testConnect(host,port) connecting.addCallback(handleSuccess,port) connecting.addErrback(handleFailure,port) reactor.run()