从网上找了不少关于twisted的Defered的文章来看,大致了解了异步机制的概念,但是看别人的东西难免有那么一点疑问,虽然别人讲的也很清楚了,可有时候就是跟自己原有的想法有出入,于是问题出来了,怎么去验证到底这种出入谁的是正确的?比如defer当中的回调,我的疑问可以简单的归纳为:
回调函数的执行是在一个任务当中的体现,还是在不同任务间的体现呢?
下面有段代码是我改进后测试我的想法用的:
from twisted.internet import reactor,defer,protocol,posixbase import time class CallbackAndDisconnectProtocol(protocol.Protocol): def connectionMade(self): print "server start" def dataReceived(self, data): defer = self.factory.dataConsole() defer.addCallback(handleSuccess,5001) defer.addErrback(handleFailure,5001) class ConnectionTestFactory(protocol.ServerFactory): protocol=CallbackAndDisconnectProtocol def dataConsole(self): time.sleep(6) print "**********************" return defer.succeed("sdfdsfsdf") def testConnect(): testFactory=ConnectionTestFactory() reactor.listenTCP(5001,testFactory) def handleSuccess(result,port): print "Connect to port %i"%port def handleFailure(failure,port): print "Error connecting to port %i: %s"%(port,failure.getErrorMessage()) if __name__=="__main__": connecting=testConnect() reactor.run()
ConnectionTestFactory当中的dataConsole方法最终返回了defer对象,随后在protocal当中为这个defer定义了回调方法,那么这个回调方法是在dataConsole方法返回后执行呢?还是在dataConsole方法执行的过程中,回调机制就会执行呢?
为了验证这一点,我特定让dataConsole方法延迟了6秒执行,然后通过cmd下telnet这个服务端,我同时开了两个telnet,这样就可以非常明白的观察出来了。
结论:callback是在dataConsole方法返回defer后才会执行的。也就是回调函数的执行体现在多个任务之间,而不是在一个任务当中先于返回defer而去执行。
结论和网上看到的牛人写的东西一致,哈哈,也许是自己的想法有点弱智,但是我自己验证了一下,更能让自己心安理得。