本文所剖析的tornado源码版本为4.4.2
ioloop是tornado的关键,是他的最底层。
ioloop就是对I/O多路复用的封装,它实现了一个单例,将这个单例保存在IOLoop._instance中
ioloop实现了Reactor模型,将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),多路复用器返回并将事先注册的相应I/O事件分发到对应的处理器中。
另外,ioloop还被用来集中运行回调函数以及集中处理定时任务。
一 准备知识:
1 首先我们要了解Reactor模型
2 其次,我们要了解I/O多路复用,由于本文假设系统为Linux,所以要了解epoll以及Python中的select模块
3 IOLoop类是Configurable类的子类,而Configurable类是一个工厂类,讲解在这。
二 创建IOLoop实例
来看IOLoop,它的父类是Configurable类,也就是说:IOLoop是一个直属配置子类
class IOLoop(Configurable): ......
这里就要结合Configurable类进行讲解:
def __new__(cls, *args, **kwargs) ''' 解析出impl对象 1 cls是直属配置子类时,impl就是该直属配置子类的'执行类对象' 2 cls是从属配置子类时,impl就是该从属配置子类自身 然后实例化一个impl实例对象 运行其initialize方法,并传入合并后的参数 返回该impl实例对象 ''' base = cls.configurable_base() init_kwargs = {} if cls is base: impl = cls.configured_class() if base.__impl_kwargs: init_kwargs.update(base.__impl_kwargs) else: impl = cls init_kwargs.update(kwargs) instance = super(Configurable, cls).__new__(impl) instance.initialize(*args, **init_kwargs) return instance