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使用-简介的更多相关文章

  1. python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介

    内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...

  2. Tornado框架简介

    -------------------简介------------------- 1.概念:     Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...

  3. Tornado框架简介(二)

    --------------------Application-------------------- 1.settings     1.debug=True:,设置tornado是否工作在调试模式, ...

  4. Python开发【Tornado】:简介与使用

    Tornado框架 简介: Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和 ...

  5. web技术培训(二)-Flask后端框架初识

    web网站发展至今,特别是服务器端,涉及到的知识.内容,非常广泛.这对程序员的要求会越来越高.如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人 ...

  6. Python Tornado简介

    简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  7. 01-tornado学习笔记-Tornado简介

    01-Tornado简介   Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用 ...

  8. Tornado简介

    Tornado是一个具有强大异步功能的Python Web框架. Hello World 使用pip安装tornado: pip install tornado 编写控制器: import torna ...

  9. python web框架简介Bottle Flask Tornado

    Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. ? 1 2 3 4 pip inst ...

随机推荐

  1. 转:折腾一晚上Bullet及Ogre相关工具的成果 -- 3Ds Max,Maya, blender, GameKit

    起始目的很简单,整合Bullet及Ogre,找个能够生成.scene和.bullet文件的建模工具. 折腾一晚上Bullet及Ogre相关的东西,基本上就像爱迪生发明灯泡一样,得出了N个失败的教训,总 ...

  2. ios中广告滚动页面(uiscrollview)

    展示功能 第一步 引入 “EScrollerView.h”,EScrollerView.m"文件 用法 NSArray *imgarr=@[@"1.jpg",@" ...

  3. ubuntu 终端中文显示乱码问题!

    1 Alt+Ctrl+F1 进入第一个终端,发现中文乱码. 2 安装zhcon. sudo apt-get install zhcon 3 输入下面命令,启动zhcon,中文显示正常. zhcon - ...

  4. Scribes:小型文本编辑器,支持远程编辑

    Scribes是一款简洁的文本编辑器.现在给大家介绍下.     功能列表,  Python插件扩展  支持远程编辑(如ftp, sftp, ssh, samba, webdav, webdavs)  ...

  5. win32 socket之select

    之前光看理论是不行滴,一定要实践,实践啊,不然永远都是门外汉!! 嗯嗯,把找到的一段源码贴上先,稍微修改了一下: #include <winsock.h> #include <std ...

  6. Log4j 基本配置示例

    1.log4j.properties log4j.rootLogger=INFO, stdout, fileout log4j.logger.TestProject=INFO log4j.append ...

  7. iphone 恢复出厂设置方法

    1.下载安装并打开itunes. 2.让手机进入恢复模式: 一.先长按住电源键,出现关机选项时,请滑动关机: 二.随后再按电源键开机,屏幕会出现苹果标志,不要松开电源键: 三.接着再按住主屏 Home ...

  8. shell脚本中解决SCP命令需要输入密码的问题

    使用密钥文件.       这里假设主机A(192.168.100.3)用来获到主机B(192.168.100.4)的文件.   在主机A上执行如下命令来生成配对密钥: ssh-keygen -t r ...

  9. sql server 删除所有表、视图、存储过程

    如果由于外键约束删除table失败,则先删除所有约束:   --/第1步**********删除所有表的外键约束*************************/   DECLARE c1 curs ...

  10. 轻量级验证码生成插件webutil-licenseImage源码与实例应用

    webutil-licenseImage 插件内置4种验证码样式,支持用户扩展.自定义样式实现简单验证码. 源码脱管地址: http://code.google.com/p/licenseimage/ ...