Tornado使用-简介
1.什么是Tornado
Tornado是一个python web框架,和一个异步网络通信库。
因为它的非阻塞网络IO,可同时支撑万级别的连接请求。
适用于长轮询,全双工websocket通信。
2.主要模块
1)web框架:RequestHandler
2)web服务器:客户端,服务端(HTTPServer,AsyncHTTPClient)
3)异步网络库:IOLoop,IOStream
4)协程库:tornado.gen可以使异步代码用一种更加直接的方式去写,而不是回调链的方式
3.注意事项
Tornado的web框架,和服务器框架是基于WSGI的,但是同时使用效率会更高。
4.异步和非阻塞IO
1)为什么要用异步和非阻塞IO
传统的同步请求的web服务器,当有多个用户同时请求时,会为每个用户创建一个独立的线程,这是非常昂贵的。
Tornado使用单线程的事件循环来处理请求,也就是说任何时间只会有一个操作是激活状态的,这就要求应用程序的所有操作都应该是异步非阻塞的。
2)阻塞
一个函数在执行的过程中等待某个操作完成通知,才能继续执行后续的代码。
这个操作可能是网络IO,磁盘IO,或者一些耗时的计算等,此时函数执行会阻塞,长时间占用CPU时间。
3)异步
异步函数在执行完成之前返回,耗时操作会在后台执行或下次执行,应用程序可以去执行其他的操作。
耗时操作执行完毕后,会通过某种方式告诉应用程序,应用程序会接着执行未完成的函数,通知方式有以下几种。
回调
返回占位符(Future,Promise,Deferred),即未来会自动执行的对象
放入待处理队列
信号
4)同步,异步示例
同步请求:
from tornado.httpclient import HTTPClient
def sync_fetch():
http_client = HTTPClient()
response = http_client.fetch("http://www.baidu.com")
print(response.body)
sync_fetch()
异步请求:
使用callback回调
from tornado.httpclient import AsyncHTTPClient, HTTPClient
def handle_response(response):
print(response.body)
http_client = AsyncHTTPClient()
http_client.fetch("http://www.baidu.com", handle_response)
http_client.close()
使用占位符,也就是协程,将来执行对象
from tornado.httpclient import AsyncHTTPClient, HTTPClient
from tornado.concurrent import Future
http_client = AsyncHTTPClient()
my_future = Future()
fetch_future =http_client.fetch("http://www.baidu.com")
fetch_future.add_done_callback(
lambda f:my_future.set_result(f.result())
)
使用协程
from tornado.httpclient import AsyncHTTPClient, HTTPClient
from tornado import gen
@gen.coroutine
def fetch_coroutine():
http_client = AsyncHTTPClient()
response = yield http_client.fetch('http://www.baidu.com')
raise gen.Return(response.body)
raise gen.Return(response.body):返回结果
5.协程
coroutines是Tornado推荐的异步代码编写方式,使用yield关键字挂起,恢复执行,来代替回调链。
协程的编写方式简单,并且减少了上下文切换,提升了效率。
1)python2中代码示例
from tornado.httpclient import AsyncHTTPClient, HTTPClient
from tornado import gen
@gen.coroutine
def fetch_coroutine():
http_client = AsyncHTTPClient()
response = yield http_client.fetch('http://www.baidu.com')
raise gen.Return(response.body)
2)python3中代码示例
async def fetch_coroutine(url):
http_client = AsyncHTTPClient()
response = await http_client.fetch(url)
return response.body
3)协程的原理
函数中包含yield关键字,那这个函数就是一个生成器,生成器是异步执行的。
生成器和函数的区别是,执行到yield关键字的地方返回,调用next()方法后,会继续接着yield表达式运行。
@gen.coroutine装饰器的作用是从生成器接收一个Future,等待(非阻塞)Future执行完成,发送Future结果到生成器,作为yield表达式的结果。
4)怎么执行协程
调用协程函数的函数必须也是个协程
@gen.coroutine
def divide(x, y):
return x / y
def bad_call():
# 错误
divide(1, 0)
@gen.coroutine
def good_call():
# 正确
yield divide(1, 0)
协程的执行方式有两种:
IOLoop.spawn_callback
在下一次IOLoop循环时,运行协程函数.spawn_callback不需要调用者的上下文空间,适合独立的协程函数的执行。
IOLoop.current().spawn_callback(divide, 1, 0)
IOLoop.run_sync
开始一个IOLoop循环,执行给定的协程函数,结束IOLoop循环。
函数的返回结果必须是一个可以yieldable的对象或者None
tornado.ioloop.IOLoop.current().run_sync(lambda :divide(1, 2))
5)协程的几种模式
和callback交互
使用gen.Task包裹函数,gen.Task返回Future,可以yield
@gen.coroutine
def call_task():
yield gen.Task(some_function, other_args)
协程函数中调用同步函数
使用ThreadPoolExecutor类,可以返回兼容协程的Futures
thread_pool = ThreadPoolExecutor(4)
@gen.coroutine
def call_blocking():
yield thread_pool.submit(blocking_func, args)
等待所有Future对象执行完毕
@gen.coroutine
def parallel_fetch(url1, url2):
resp1, resp2 = yield [http_client.fetch(url1),
http_client.fetch(url2)]
循环
import motor
db = motor.MotorClient().test
@gen.coroutine
def loop_example(collection):
cursor = db.collection.find()
while (yield cursor.fetch_next):
doc = cursor.next_object()
Tornado使用-简介的更多相关文章
- python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介
内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...
- Tornado框架简介
-------------------简介------------------- 1.概念: Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...
- Tornado框架简介(二)
--------------------Application-------------------- 1.settings 1.debug=True:,设置tornado是否工作在调试模式, ...
- Python开发【Tornado】:简介与使用
Tornado框架 简介: Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和 ...
- web技术培训(二)-Flask后端框架初识
web网站发展至今,特别是服务器端,涉及到的知识.内容,非常广泛.这对程序员的要求会越来越高.如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人 ...
- Python Tornado简介
简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- 01-tornado学习笔记-Tornado简介
01-Tornado简介 Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用 ...
- Tornado简介
Tornado是一个具有强大异步功能的Python Web框架. Hello World 使用pip安装tornado: pip install tornado 编写控制器: import torna ...
- python web框架简介Bottle Flask Tornado
Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. ? 1 2 3 4 pip inst ...
随机推荐
- 最常用的Java库一览(13年的文章)
来源于:http://www.importnew.com/7530.html 本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入翻译小组.转载请见文末要求. 写在前面: ...
- StatefulSet和Deployment的区别
“Deployment用于部署无状态服务,StatefulSet用来部署有状态服务”. 具体的,什么场景需要使用StatefulSet呢?官方给出的建议是,如果你部署的应用满足以下一个或多个部署需求, ...
- vijos:旅行家的预算[贪心]
题目 Problem description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶 ...
- spring加载jar包中多个配置文件(转)
转自:http://evan0625.iteye.com/blog/1598366 在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <co ...
- 【LeetCode】3. Longest Substring Without Repeating Characters (2 solutions)
Longest Substring Without Repeating Characters Given a string, find the length of the longest substr ...
- Gedit 有用插件介绍
刚刚接触Ubuntu,对于高手们用的Vim,本人只能望尘莫及.但是,Ubuntu自带的Gedit让我找到了windows的感觉,而且在添加一些插件后更加喜欢这个工具了. gedit本身带有一些常用插件 ...
- 如果没有 Android 世界会是什么样子?
2005年谷歌从安迪·鲁宾(Andy Rubin)手中收购Android系统,起初安迪·鲁宾(Andy Rubin)只是想为数码相机开发出一个更为先进的系统,所以有了 Android.但是智能手机行业 ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...
- javascript 中 split 函数分割字符串成数组
分割字符串成数组的方法有很多,不过使用最多的还是split函数 <script language="javascript"> str="2,2,3,5,6,6 ...