tornado源码分析系列(二)
2012-07-18 17:52
363 查看
引言:上一章起了个头,讲了tornado的源码结构和IOLoop的简单Demo,这一章就IOLoop类的方法来看看IOLoop提供了哪些功能。
看看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中的几个重要函数,后面依次会有分析其他方法,还有其中一些细节值得平常注意的。
看看IOLoop的类组织结构
?
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
?
看看waker是这样定义的:
?
instance就是简单的返回一个实例:
?
在add_handler()里面
?
|------
在tornado中,函数是通过stack_context.wrap()包装过,可以用来记录上下文
如果需要调用被包装过的函数,需要调用方法
_run_callback(self, callback)
这个函数将包装过的callback作为参数出入,然后执行函数
?
-------|
_impl.register就是被封装过的epoll的epoll_ctl,参数是EPOLL_CTL_ADD
见同一个文件下的_EPoll类
?
总结:这一章讲了IOLoop中的几个重要函数,后面依次会有分析其他方法,还有其中一些细节值得平常注意的。
相关文章推荐
- tornado源码分析系列 [网络层 IOLoop类] 优秀系列文章可以看看
- Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine
- tornado源码分析系列(五)[HTTPServer 层]
- tornado源码分析系列一
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
- Android Apk资源加载机制源码分析以及资源动态加载实现系列文章
- jQuery源码分析系列:Deferred延迟队列
- Linux-0.11内核源码分析系列:进程调度
- jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
- Linux-0.11内核源码分析系列:内存管理free_page()与free_page_tables()函数分析
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析
- Android 4.0 Launcher源码分析系列(一)
- Tornado源码分析之http服务器篇
- jQuery-1.9.1源码分析系列(一)整体架构
- jQuery-1.9.1源码分析系列(九) CSS操作
- jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
- Android 4.0 Launcher源码分析系列
- lucene4.5源码分析系列:lucene概述
- jQuery源码分析系列(40): 动画设计
- 自定义View系列教程02--onMeasure源码详尽分析