deferred “异步”功能的实现,与多线程彻底不一样,具备如下特色: 1. deferred 产生的 event,是函数调用返回的对象; 2. deferred 表明一个链接任务,负责报告任务执行的延迟状况和最终结果; 3. 对deferred 的操做,经过预约的“事件响应器”(event handler)进行。 defer的使用方式: 1). 在factory中建立deferred对象,但在调用factory对象以外返回自身的deferred对象, 而后再添加callback和errback, 具体示例以下: #! /usr/bin/env python #coding=utf-8 from twisted.internet import reactor, defer, protocol class CallbackAndDisconnectProtocol(protocol.Protocol): def connectionMade(self): self.factory.deferred.callback("Connected!") # self.transport.loseConnection() class ConnectionTestFactory(protocol.ClientFactory): protocol = CallbackAndDisconnectProtocol def __init__(self): self.deferred = defer.Deferred() def clientConnectionFailed(self, connector, reason): self.deferred.errback(reason) def testConnect( port): testFactory = ConnectionTestFactory() reactor.listenTCP(port, testFactory) return testFactory.deferred def handleSuccess(result, port): #deferred "event-responsor": handle finished connection print 'result-----',result print "Connected 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__': port = 50001 conndefer = testConnect(port) conndefer.addCallback(handleSuccess, port) conndefer.addErrback(handleFailure, port) reactor.run() 2). 不显示建立deferred对象, 在函数返回时,咱们调用defer.succeed(results)函数。 其中result则能够为调用咱们延时操做函数返回的结果。示例以下: #! /usr/bin/env python #coding=utf-8 from twisted.internet import protocol, reactor, defer from twisted.protocols import basic class FingerProtocol(basic.LineReceiver): def lineReceived(self, user): self.factory.getUser(user ).addErrback(lambda _: "Internal error in server" ).addCallback(lambda m: (self.transport.write(m+"/r/n"))) class FingerFactory(protocol.ServerFactory): protocol = FingerProtocol def __init__(self, **kwargs): self.users = kwargs print self.users def getUser(self, user): return defer.succeed(self.users.get(user, "No such user")) if __name__ == '__main__': reactor.listenTCP(1077, FingerFactory(hd='Hello my python world')) reactor.run()