tornado源码分析-iostream
tornado源码分析-iostream
1.iostream.py作用
用来异步读写文件,socket通信
2.使用示例
import tornado.ioloop
import tornado.iostream
import socket
def send_request():
stream.write(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
stream.read_until(b"\r\n\r\n", on_headers)
def on_headers(data):
headers = {}
for line in data.split(b"\r\n"):
parts = line.split(b":")
if len(parts) == 2:
headers[parts[0]] = parts[1]
stream.read_bytes(int(headers[b"Content-Length"]), on_body)
def on_body(data):
print(data)
with open('sina.html', 'wb') as f:
f.write(data)
stream.close()
tornado.ioloop.IOLoop.current().stop()
if __name__ == '__main__':
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
stream = tornado.iostream.IOStream(client_socket)
stream.connect(("www.sina.com.cn", 80), send_request)
tornado.ioloop.IOLoop.current().start()
与传统socket通信的区别是,iostream对socket进行了包装,可以进行异步的读写。
3.iostream主要功能
class IOStream(BaseIOStream):
def read_until(self, delimiter, callback):
future = self._set_read_callback(callback)
self._read_delimiter = delimiter
self._read_max_bytes = max_bytes
try:
self._try_inline_read()
except:
...
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):
...
def _handle_events(self, fd, events):
...
def _add_io_state(self, state):
...
if self._state is None:
self._state = ioloop.IOLoop.ERROR | state
with stack_context.NullContext():
self.io_loop.add_handler(
self.fileno(), self._handle_events, self._state)
elif not self._state & state:
self._state = self._state | state
self.io_loop.update_handler(self.fileno(), self._state)
def connect(self, address, callback=None, server_hostname=None):
...
def _try_inline_read(self):
# See if we've already got the data from a previous read
self._run_streaming_callback()
pos = self._find_read_pos()
if pos is not None:
self._read_from_buffer(pos)
return
self._check_closed()
try:
pos = self._read_to_buffer_loop()
except Exception:
...
if pos is not None:
self._read_from_buffer(pos)
return
if self.closed():
self._maybe_run_close_callback()
else:
self._add_io_state(ioloop.IOLoop.READ)
def _read_from_buffer(self, pos):
self._read_bytes = self._read_delimiter = self._read_regex = None
self._read_partial = False
self._run_read_callback(pos, False)
def _run_read_callback(self, size, streaming):
if streaming:
callback = self._streaming_callback
else:
callback = self._read_callback
self._read_callback = self._streaming_callback = None
if self._read_future is not None:
assert callback is None
future = self._read_future
self._read_future = None
future.set_result(self._consume(size))
if callback is not None:
assert (self._read_future is None) or streaming
self._run_callback(callback, self._consume(size))
else:
self._maybe_add_error_listener()
def _consume(self, loc):
...
read_until:读到delimiter结束
read_bytes:读取num_bytes个字符后结束
read_until_regex:读取到正则匹配到后结束
read_until_close:读取到scoket关闭后结束
读流程:
self._run_streaming_callback()
字节流回调,待研究
future = self._set_read_callback(callback)
注册读完成回调事件
pos = self._find_read_pos()
读取位置
self._read_from_buffer(pos)
从缓存读取
pos = self._read_to_buffer_loop()
socket等待接收数据,放入缓存
self._read_from_buffer(pos)
从缓存读取
self._consume(size)
读缓冲器size个字节,从缓冲区删除并返回这些数据
_maybe_add_error_listener
没有可读数据,开启监听read事件,当read事件发生时再调用handle_read处理
_pending_callbacks
控制信号量,待研究
write:首先将data按数据块大小WRITE_BUFFER_CHUNK_SIZE分块写入write_buffer,
然后调用handle_write向socket发送数据
connect:建立非阻塞socket连接,注册ioloop可写事件
_add_io_state:为ioloop注册或更新READ,WRITE,ERROR事件,ioloop异步执行读socket,写socket操作等
handle_read:从socket读到缓冲区
handle_write:由缓冲区向socket写
tornado源码分析-iostream的更多相关文章
- Tornado源码分析 --- 静态文件处理模块
每个web框架都会有对静态文件的处理支持,下面对于Tornado的静态文件的处理模块的源码进行分析,以加强自己对静态文件处理的理解. 先从Tornado的主要模块 web.py 入手,可以看到在App ...
- Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine
转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏 ...
- Tornado源码分析 --- Cookie和XSRF机制
Cookie和Session的理解: 具体Cookie的介绍,可以参考:HTTP Cookie详解 可以先查看之前的一篇文章:Tornado的Cookie过期问题 XSRF跨域请求伪造(Cross-S ...
- Tornado源码分析 --- Redirect重定向
“重定向”简单介绍: “重定向”指的是HTTP重定向,是HTTP协议的一种机制.当client向server发送一个请求,要求获取一个资源时,在server接收到这个请求后发现请求的这个资源实际存放在 ...
- Tornado源码分析之http服务器篇
转载自 http://kenby.iteye.com/blog/1159621 一. Tornado是什么? Facebook发布了开源网络服务器框架Tornado,该平台基于Facebook刚刚收购 ...
- tornado源码分析系列一
先来看一个简单的示例: #!/usr/bin/env python #coding:utf8 import socket def run(): sock = socket.socket(socket. ...
- tornado源码分析
初识tornado 首先从经典的helloword案例入手 import tornado.ioloop import tornado.web class MainHandler(tornado.web ...
- tornado源码分析-多进程
1.源码文件 process.py 2.fork子进程 def fork_processes(num_processes, max_restarts=100): ... def start_child ...
- tornado源码分析-模块介绍
1.Core web framework tornado.web - web框架功能模块,包括RequestHandler和Application两个重要的类 tornado.httpserver - ...
随机推荐
- 转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
看到有人在ps区咨询如何安装3d max教程,当你进行第一步之前,请先断开网络连接第一步:运行安装程序 第二步:接受安装协议,点击下一步会提示输入序列号 第三步:你会看到已经安装完成了的界面 第四部: ...
- python使用mysql数据库(转)
参考地址 一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外 ...
- Anroid 4大组件之android.app.Service
android.app.Service A Service is an application component representing either an application's desir ...
- 阿里云ECS 利用快照创建磁盘实现无损扩容数据盘
在扩容数据盘时,若遇到磁盘原因导致无法无损的扩容时,可以临时购买一块独立云磁盘来存放数据,然后将数据盘彻底格式化来解决,以下是操作步骤: 1. 首先基于当前数据盘创建一个快照,备份数据,同时可以利用 ...
- HttpClient库设置超时
HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...
- MATLAB 的unique函数——数组矩阵的唯一值
MATLAB 的unique函数——求数组矩阵的唯一值 相关MathWork文档见此:unique数组中的唯一值 1.C = unique(A) 返回与 A 中相同的数据,但是不包含重复项.C 已按照 ...
- [转]nf_conntrack: table full, dropping packet 连接跟踪表已满,开始丢包 的解决办法
nf_conntrack: table full, dropping packet 连接跟踪表已满,开始丢包 的解决办法 中午业务说机器不能登录,我通过USM管理界面登录单板的时候发现机器没有僵 ...
- C# 使用系统方法发送异步邮件
项目背景: 最近在对几年前的一个项目进行重构,发现发送邮件功能需要一定的时间来处理,而由于发送是同步的因此导致在发送邮件时无法执行后续的操作 实际上发送邮件后只需要将发送结果写入系统日志即可对其他业务 ...
- 【java】详解java中的注解(Annotation)
目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...
- Git 远程仓库(分布式版本控制系统)
前言 远程仓库是指托管在因特网或其他网络中的你的项目的版本库.你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写. 1.查看远程仓库 如果想查看你已经配置的远程仓库服务器,可以运行 git ...