python高级应用-twisted框架

来源:互联网 发布:sublimetext2 python 编辑:程序博客网 时间:2024/06/04 23:29

关于twisted的介绍,我觉得这篇blog写得挺好的

总得来说,twisted是为python提供一个异步操作,跟java中的NIO很类似,twisted框架的低层实现技术是使用yield协程来创建一个Reactor loop,在这个loop中,当一个事件发生后就把事件分发给相应的处理程序,并且这个事件监听是异步的,在单线程的环境下,既避免了线程的阻塞,又可以省去CPU对线程的调度消耗,缺点也很明显,就是不能利用多核CPU。

#!encoding=utf8
from twisted.internet import reactor
reactor.run()

执行这段代码,程序会卡住,这里的卡住并不是真正的卡住,而是异步的select在监听事件的发生,然后我们却什么事件也没有写,因此永远都不会有事件到来,所以会一直等待下去,但是这个等待其实并不会浪费多少CPU,因为这里的select是异步非阻塞的。通过查看系统监视器我们可以发现python其实并没有占用CPU

想要reactor能够监听到事件,要先给loop中添加一个事件

#!encoding=utf8
from twisted.internet import reactor
# reactor.run()
def test():
print "do something"
reactor.callWhenRunning(test)
reactor.run()

此段代码运行的结果:

do something

当打印出do something后程序又卡住了,这是因为当监听处理守test后reactor又进入到监听等待状态了

根据上面的代码,很明显能够看出reactor loop是通过回调来实现事件监听处理的,reactor调用callWhenRunning时传入函数test的引用,当处理事件时就调用test函数。


其实reactor是一个Singlton的,我们并不能直接创建reactor的对象,如果想停止loop,可以在任意时刻任意地点调用reactor.stop函数,reactor还有一个延迟执行函数reactor.callLater(n,func)第一个参数是延迟的时间,第二个参数是要执行的操作的函数回调。并且这个延迟执行也是基本异步的。


由于网络是需要很强的健壮性的,当一个随机bug发生时,应该不能影响到整个网络连接过程,因为reactor在一个事件中如果产生了异常,这个异常并不会传递出来而影响到其他的事件。





原创粉丝点击