• 对socket封装的IOStream机制概览

    IOStream是什么?
    服务器君一共花费 10.009 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的
    1. Chapter:

    IOStream对socket读写进行了封装,分别提供读、写缓冲区实现对socket的异步读写。当socket被accept之后HTTPServer的_handle_connection会被回调并初始化IOStream对象,进一步通过IOStream提供的功能接口完成socket的读写。文章接下来将关注IOStream实现读写的细节。

    IOStream的初始化

    IOStream初始化过程中主要完成以下操作:

    1. 绑定对应的socket
    2. 绑定ioloop
    3. 创建读缓冲区_read_buffer,一个python deque容器
    4. 创建写缓冲区_write_buffer,同样也是一个python deque容器

    IOStream提供的主要功能接口

    主要的读写接口包括以下四个:

    class IOStream(object):
    	def read_until(self, delimiter, callback): 
    	def read_bytes(self, num_bytes, callback, streaming_callback=None): 
    	def read_until_regex(self, regex, callback): 
    	def read_until_close(self, callback, streaming_callback=None): 
    	def write(self, data, callback=None):
    
    • read_until和read_bytes是最常用的读接口,它们工作的过程都是先注册读事件结束时调用的回调函数,然后调用_try_inline_read方法。_try_inline_read首先尝试_read_from_buffer,即从上一次的读缓冲区中取数据,如果有数据直接调用 self._run_callback(callback, self._consume(data_length)) 执行回调函数,_consume消耗掉了_read_buffer中的数据;否则即_read_buffer之前没有未读数据,先通过_read_to_buffer将数据从socket读入_read_buffer,然后再执行_read_from_buffer操作。read_until和read_bytes的区别在于_read_from_buffer过程中截取数据的方法不同,read_until读取到delimiter终止,而read_bytes则读取num_bytes个字节终止。执行过程如下图所示:
    • read_until_regex相当于delimiter为某一正则表达式的read_until。
    • read_until_close主要用于IOStream流关闭前后的读取:如果调用read_until_close时stream已经关闭,那么将会_consume掉_read_buffer中的所有数据;否则_read_until_close标志位设为True,注册_streaming_callback回调函数,调用_add_io_state添加io_loop.READ状态。
    • write首先将data按照数据块大小WRITE_BUFFER_CHUNK_SIZE分块写入write_buffer,然后调用handle_write向socket发送数据。

    其他内部功能接口

    • def _handle_events(self, fd, events): 通常为IOLoop对象add_handler方法传入的回调函数,由IOLoop的事件机制来进行调度。
    • def _add_io_state(self, state): 为IOLoop对象的handler注册IOLoop.READ或IOLoop.WRITE状态,handler为IOStream对象的_handle_events方法。
    • def _consume(self, loc): 合并读缓冲区loc个字节,从读缓冲区删除并返回这些数据。
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [Python程序设计] Django与表单 4 个条目
  2. [软件工程与项目管理] 开始使用Git 3 个条目
  3. [PHP程序设计] Nginx基本操作释疑 7 个条目
  4. [智力开发与知识管理] 超越整体性学习 5 个条目
  5. [C语言程序设计] C语言里的全局变量 2 个条目
  6. [数据库技术] MySQL常用自带函数 3 个条目
  7. [数据库技术] 数据库范式篇 5 个条目
  8. [软件工程与项目管理] 开始了解Git 5 个条目
  9. [移动开发] 从代码角度去认识HttpClient 2 个条目
  10. [移动开发] Android SQLite增删查改实例(数据:魔弹之王) 2 个条目
  11. [PHP程序设计] 对输入文件类型的检测 1 个条目
  12. [移动开发] Android开发基础知识 4 个条目
窗口