tornado源码简单实现
首先基本的同步流程是:
class Index(tornado.web.RequestHandle):
def get(self):
self.write('hellow,word') app = tornado.web.Application(
[(r'/index',Index)
]
)
if __name == '__main__':
app.listen(8000)
tornado.ioloop.IOLoop.instance().start()
基本的异步流程是:
import tornado.web
import tornado.ioloop
from tornado import gen
from tornado.web import Future
import time class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
print 123
future = Future()
tornado.ioloop.IOLoop.current().add_timeout(time.time() +5 ,self.doing)
yield future def doing(self):
self.write('1111')
self.finish() app = tornado.web.Application(
[(r'/index',MainHandler)]
) if __name__ == '__main__':
app.listen(8000)
tornado.ioloop.IOLoop.instance().start()
主要三个步骤实现异步,
1、future函数
2、事件循环
3、生成器
源码实现:
route = (
/^index$ func
)
result_dict{ }
s = socket.socket(...)
s.bind(...)
s.setblock(False)
inputs = []
inputs.append(s)
while True:
r,w,e = select.select(inputs,[],e,0.05) 如果有链接连入,那么这个时候变化的是服务器的socket对象,所以连接的时候返回的r就是s,如果不是s那就是已连接的其他socket对象发送数据了
for i in r:
if r == s:
conn,addr = i.accept()
inputs.append(conn)
else:
#有数据来了
data_list = []
while True:
data = i.recv(1024)
data.append(data)
if not data:
breake
#这个时候需要响应,在datalist里面获取请求头,获取url,然后获取url对应的函数
data = func()
if data is str:
i.sendall()
i.close()
inputs.remove(i) else: #如果返回的不是一个字符串而是一个对象,那么这个时候把这个对象保存到字典里面
result_dict[i] = data
for k,v in result_dict.items():
if v.status:
k.sendall()
tornado源码简单实现的更多相关文章
- 第五篇:白话tornado源码之褪去模板的外衣
上一篇<白话tornado源码之请求来了>介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了 ...
- 第三篇:白话tornado源码之请求来了
上一篇<白话tornado源码之待请求阶段>中介绍了tornado框架在客户端请求之前所做的准备(下图1.2部分),本质上就是创建了一个socket服务端,并进行了IP和端口的绑定,但是未 ...
- Python框架之Tornado (源码之褪去模板外衣)
上一篇介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了简单的字符串,如:“Hello World”,而 ...
- 第二篇:白话tornado源码之待请求阶段
上篇<白话tornado源码之一个脚本引发的血案>用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码. 概述 上图是torna ...
- Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine
转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏 ...
- FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- FFmpeg源码简单分析:libswscale的sws_scale()
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- APIView源码简单分析图
APIView源码简单分析 !声明:下面这个dispatch分发方法不在是父类View里的dispatch了,APIView重新封装了这个dispatch.(整个核心就是initialize_requ ...
- tornado源码分析-iostream
tornado源码分析-iostream 1.iostream.py作用 用来异步读写文件,socket通信 2.使用示例 import tornado.ioloop import tornado.i ...
随机推荐
- [笔记]makefile编写
makefile的隐含规则默认处理第一个目标 函数:wildcard可以进行文本匹配 patsubst内容替换 变量: $@代表目标 $^ 代表全部依赖 $< 第一个依赖 $? 第一个变 ...
- docker删除容器再删除镜像
1. 查询镜像 docker images 现在想删除第一个,ID为 99f85991949f 的镜像. docker rmi ID 从上面看出,需要先停到ID为 67*** 的容器. 2. 查询容 ...
- 在oracle数据库里创建自增ID字段的步骤
CREATE TABLE ADVICE ( ID INT NOT NULL, ACTIVE NOT NULL, TYPE INT NOT NULL, MSG ) NOT NULL, ADVICE ) ...
- es6 的数组的方法
es6 数组的拓展 数组的类 Array 数组的定义: 1. var arr=[]; 2. var arr=new Array(3) // 3 代表有三个元素 arr[0]=12; arr[1]=24 ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- Node.js读取文件相对路径写法注意
首先看一下文件的存放结构: 我们现在希望在上面标记的JS文件里面读取html里面的内容,我们的代码如下: var fs=require("fs"); fs.readFile('te ...
- Emacs 浏览网页
Emacs 浏览网页非常方便,还可以忽略掉那些烦人的小广告.特别是在看小说 的时候~ 在之前了解如何通过Emacs浏览网页时,大部分人使用的是w3m,折腾了半天,没能成功.后来无意间发现 ,有EWW ...
- [mysql]root用户登录mysql,输入密码后报错:Access denied for user 'root'@'localhost'
问题如下: wangju-G4:~$ mysql -u root -p Enter password: ERROR (): Access denied for user 'root'@'localho ...
- [Flask]通过render_form快捷渲染表单
依赖: Bootstrap-Flask 实例化方式与flask_bootstrap相同. 关于render_form(): Bootstrap-Flask内置了两个用于渲染WTForms表单类的宏,r ...
- Xpath 和Css Selector使用
Xpath是xml的路径语言,就是通过元素的路径来查找标签元素. Xpath直接在火狐浏览器的firebug中练习,49版本一下的火狐才能用firebug插件. Xpath的使用方法 注://* ...