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 ...
随机推荐
- 18.Python格式化字符串(格式化输出)
Python 提供了“%”对各种类型的数据进行格式化输出,例如如下代码: price = 108 print ("the book's price is %s" % price) ...
- idea为项目添加ignore文件忽略unversion的文件
最近初学Git,而且在使用的IDE是IntelliJ IDEA,发现IDEA在提交项目到本地仓库的时候,会把.idea文件夹中的内容也提交上去,这里面放的是一些项目的配置信息,包括历史记录,版本控制信 ...
- Java操作Redis数据
Redis 是完全开源免费的,遵守BSD协议,先进的key - value持久化产品.它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map),列表(list) ...
- nginx location正则
nginx location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # ...
- leetcode-easy-string-28 Implement strStr()
mycode 77.15% class Solution(object): def strStr(self, haystack, needle): """ :type ...
- RGB-D显著性突出物体(学习)
论文阅读:Adaptive Fusion for RGB-D Salient Object Detection 这篇代码的创新点在于使用了SW层,使用SW_logits * img_logits + ...
- Dark 类与对象
1 类的声明 使用class声明一个类 使用new 创建一个对象,new可省略 dark文件名和声明的类名可以不一样,与java不同 void main() { var function = Pers ...
- wordpress 更新时需要FTP 服务器账户密码的解决方法
首先进入 apache下的wordpress 的目录下 (这是apache服务器默认安装的路径) cd /var/www 接着,给html整个文件夹进行赋值权限,如果不赋予权限 更新的时候会报权限不足 ...
- 七、创建UcRESTTemplate请求管理器
一.创建UcRESTTemplate管理器封装 import com.alibaba.fastjson.JSON; import org.apache.http.client.config.Reque ...
- [flask]jina2处理表单--实现搜索功能
思路: 获取查询关键字 查询数据库,获得查询结果 将查询结果返回模板文件 forms.py from flask_wtf import FlaskForm from wtforms import S ...