首先基本的同步流程是:

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源码简单实现的更多相关文章

  1. 第五篇:白话tornado源码之褪去模板的外衣

    上一篇<白话tornado源码之请求来了>介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了 ...

  2. 第三篇:白话tornado源码之请求来了

    上一篇<白话tornado源码之待请求阶段>中介绍了tornado框架在客户端请求之前所做的准备(下图1.2部分),本质上就是创建了一个socket服务端,并进行了IP和端口的绑定,但是未 ...

  3. Python框架之Tornado (源码之褪去模板外衣)

    上一篇介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了简单的字符串,如:“Hello World”,而 ...

  4. 第二篇:白话tornado源码之待请求阶段

    上篇<白话tornado源码之一个脚本引发的血案>用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码. 概述 上图是torna ...

  5. Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine

    转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏 ...

  6. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  7. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  8. APIView源码简单分析图

    APIView源码简单分析 !声明:下面这个dispatch分发方法不在是父类View里的dispatch了,APIView重新封装了这个dispatch.(整个核心就是initialize_requ ...

  9. tornado源码分析-iostream

    tornado源码分析-iostream 1.iostream.py作用 用来异步读写文件,socket通信 2.使用示例 import tornado.ioloop import tornado.i ...

随机推荐

  1. Ubuntu18.04安装rabbitvcs svn图形化客户端和简单实用

    1.1  自带source源里面查找rabbitvcs信息 sudo apt search rabbitvcs 1.2  安装rabbitvcs sudo apt install rabbitvcs- ...

  2. spark RDD 的基本操作

    好记性不如烂笔头,分享一下 Spark是一个计算框架,是对mapreduce计算框架的改进,mapreduce计算框架是基于键值对也就是map的形式,之所以使用键值对是人们发现世界上大部分计算都可以使 ...

  3. Java中String.getBytes()

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回的东西不一样!  String.getBytes(String decode) ...

  4. spring eclipse xml自动提示

    window -> preferences -> XML -> XML Catalog -> 在User Specified Entries新增加一个catalog

  5. Git检出和提交至远程仓库

    步骤一:首先需要一个Github账号,还没有的话先去注册:https://github.com/,我们使用Git需要先安装Git工具,这里给出下载地址:https://git-for-windows. ...

  6. 【6】font-size 字体属性

    font-style                         --  字体风格 font-variant                      -- 小型大写字母文本 font-weigh ...

  7. Thymeleaf 页面表达式基础

    转自:http://www.cnblogs.com/vinphy/p/4674247.html#undefined (一)Thymeleaf 是个什么?      简单说, Thymeleaf 是一个 ...

  8. web开发(六) EL表达式

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6432044.html>,在此仅供学习参考之用. 一.EL ...

  9. Counter() most_common()

    1 不仅可以统计list中元素的出现次数,也可以对str中的元素进行统计 # collections包中的Counter用于统计str list 中元素出现次数 from collections im ...

  10. linux判断httpd端口是否打开

    判断端口是否打开 lsof -i:80 判断端口打开了几个 lsof -i:80 | wc -l