tornado.ioloop.IOLoop.instance().start()
ioloop继承自Configurable。
configurable_base返回IOLoop,然后调用configured_class,然后再看IOLoop的configurable_default。这里面根据不同系统选择了不同的IOLoop类实现返回。下一步是initialize初始化了。
看一下epoll吧。
先找了一下IOLoop的start(),意料之中。因为configurable_default返回的类实现都是别的类,要看具体别的类中的定义了。
epoll.py里的EPollIOLoop只定义了initialize,EPollIOLoop继承自PollIOLoop,在ioloop.py文件里。
PollIOLoop继承自IOLoop,现在还不知道为什么这么继承,先往下看。super,IOLoop里边是空的。下边用到initialize第二个参数是impl。在PollIOLoop里是select.epoll()。还要去看看platform/select.py,额 我去还是import select。标准库中的select.epoll()返回一个epoll obj。判断是否有fileno属性,这个方法是返回一个文件描述符的。然后不知道是怎么操作这个句柄的不懂。先过。。
设置了一堆值。看platform/common.py里的Waker.继承自interface.Waker.父类只是定义了几个方法名。
先看初始化,self.write是个socket.self.writer.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)注释说禁止buffer,有数据就立即发送。
下边是做了一个测试,好像有些系统不支持检查出来。
下边又没懂,a都关闭了,还要那个文件描述符干嘛.这块后边做个测试研究一下。
初始化完了回到PollIOLoop,add_handler,第一个参数a的文件描述符,第二个参数consume是从a读数据读完为止。第三个参数是IOLoop里定义的,这里体现出继承的意义来了。
看add_handler,spit_fd取文件描述符,第二个handlers空,添加fd为key,文件描述符,handler为值。
没看懂,注释说就为了在io loop空闲时,想让他醒来发送假数据,这里也先过,网络方面的还是懂的太少了
然后初始化完成了。。下边是调用instance()了。这个只有在IOLoop里有定义,这里才是真正的继承意义。开始是没有_instance的,然后加锁,定义个实例IOLoop()返回这个实例。
饶了这么多圈终于实例化了。。。卧槽来
然后start(),PollIOLoop里,这里开始ioloop的循环执行了。详细的先不看了,看了一下等后边仔细分析一下。上边的waker也是结合这里一起再看一遍。
上一篇: tornado源码阅读-Configurable
下一篇: tornado源码阅读-httpserver
0 Responses so far.