您的位置:首页 > 理论基础 > 计算机网络

tornado源码分析系列 [网络层 IOLoop类] 优秀系列文章可以看看

2014-12-17 17:07 405 查看
看看IOLoop的类组织结构

从上一章的Demo里面可以看到最重要的对外提供的方法有

0.instance() @classmethod

1.add_handler(...)

2.start()

类似于传统的事件驱动方式,这里的使用方式也很简单

从IOLoop类中看起:

先是自己定义了几个EPOLL的宏,就是EPOLL的事件类型

#epoll 的事件类型,类似于这里的宏定义

_EPOLLIN = 0x001

_EPOLLPRI = 0x002

_EPOLLOUT = 0x004

_EPOLLERR = 0x008

_EPOLLHUP = 0x010

_EPOLLRDHUP = 0x2000

_EPOLLONESHOT = (1 << 30)

_EPOLLET = (1 << 31)

# Our events map exactly to the epoll events

#将这几个事件类型重定义一番

NONE = 0

READ = _EPOLLIN

WRITE = _EPOLLOUT

ERROR = _EPOLLERR | _EPOLLHUP | _EPOLLRDHUP

常用的就是三种,READ,WRITE,ERROR

注意最后的几点,将管道描述符的读端也加入事件循环检查,并设置相应的回调函数,这样做的好处是以便事件循环阻塞而没有相应描述符出现,需要在最大timeout时间之前返回,就可以向这个管道发送一个字符,用来终止阻塞在监听阶段的事件循环监听函数。

看看waker是这样定义的:

需要唤醒阻塞中的事件循环监听函数的时候,只需要向管道写入一个字符,就可以提前结束循环

instance就是简单的返回一个实例:

instance()是一个静态方法,代表此IOLoop是一个单实例方法,一个进程只有一个

在add_handler()里面

可以看到,使用字典的方式,每一个fd就对应一个handler,下次事件循环返回的时候按照返回后的fd列表,依次调用相应的callback

|------

在tornado中,函数是通过stack_context.wrap()包装过,可以用来记录上下文

如果需要调用被包装过的函数,需要调用方法

_run_callback(self, callback)  

这个函数将包装过的callback作为参数出入,然后执行函数

当函数执行发生异常时,可以记录下函数执行状态  

-------|

_impl.register就是被封装过的epoll的epoll_ctl,参数是EPOLL_CTL_ADD

见同一个文件下的_EPoll类

  

总结:这一章讲了IOLoop中的几个重要函数,后面依次会有分析其他方法,还有其中一些细节值得平常注意的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: