tornado 11 异步编程

一、同步与异步

  同步

#含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系

#现象:有一个共同的时钟,按来的顺序一个一个处理

#直观感受:需要等待,效率低下

  异步

#含义:双方不需要共同的时钟,就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接受的信息,如开始位,同时在结束时有结束位

#现象:没有共同的时钟,不考虑顺序来了就处理

#直观感受:不需要等待,效率高

二、阻塞与非阻塞

  阻塞调用

#含义:阻塞调用是指在调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回

#现象:读套接字是没用数据等数据来,写套接字时写不下了也一直等,等能写下了往下写(套接字被写满的原因不在本地,在于网络另一头的套接字被写满了来不及读出去,导致本地的套接字内容发不出来,堵住了)

#直观感受:执着

  非阻塞调用

#含义:非阻塞调用是指没有调用结果立即返回,当前线程不被挂起,可以继续做其他工作

#现象:读套接字是没有数据,不等直接返回干别得事情去了,写套接字写不下了也不写了,直接返回干别的事情去了

#直观感受:勤奋

三、异步编程

#tornado是单线程的,一次只能处理一个请求;但是由于他是异步的,所以是高并发的

#那么在tornado中,同时有多个请求发送过来时,而且其中还有请求发生阻塞,会产生什么样的后果呢?
#在实现第四种异步方法的时候需要导入两个模块

futures requests
import time
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
from tornado.web import authenticated
import tornado.websocket
import tornado.httpclient
import tornado.gen
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor
import requests
import util.ui_methods
import util.ui_modules
from data.user_modules import User #导入module包
from pycket.session import SessionMixin
import datetime define('port',default=8080,help = 'run port',type=int) class BaseHandler(tornado.web.RequestHandler,SessionMixin):
def get_current_user(self):
current_user = self.session.get('user')
if current_user:
return current_user
return None class AbcHandler(BaseHandler):
def get(self):
self.write('abc ok') class SyncHandler(BaseHandler):
def get(self):
client = tornado.httpclient.HTTPClient()
response = client.fetch('http://127.0.0.1:8080/sync?id=2') #这是模拟阻塞的接口,该接口代码里面有sleep用来模拟阻塞
print(response)
self.write(response.body) #1、通过回调函数实现异步
class CallbcakHandler(BaseHandler): #这便是异步的方法,在阻塞的时候就直接处理其他的请求
@tornado.web.asynchronous #必须得装上装饰器
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
response = client.fetch('http://127.0.0.1:8080/sync?id=2',callback=self.on_response) #当这个地方发生阻塞时,并没有在这个地方等待,而是后面的全部处理完了才来处理这个
self.write('ok') #这便是通过回调函数实现异步,先出现ok,在回到上面 def on_response(self,res):
print(res)
self.write(res.body)
self.finish() #在这个回调函数中必须加上finish,不加上的话就会不知道上面的接口函数什么时候结束 #2、通过协程实现异步
class GenHandler(BaseHandler):
@tornado.web.asynchronous
@tornado.gen.coroutine #协程
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
response = yield tornado.gen.Task(client.fetch,'http://127.0.0.1:8080/sync?id=2') #yield生成器,有等待、暂停的功能
self.write(response.body) #3、通过协程实现异步(自定义函数) 更加灵活
class FuncHandler(BaseHandler):
@tornado.web.asynchronous
@tornado.gen.coroutine #协程
def get(self):
response = yield self.func()
self.write(response.body) @tornado.gen.coroutine
def func(self):
client = tornado.httpclient.AsyncHTTPClient()
response = yield tornado.gen.Task(client.fetch, 'http://127.0.0.1:8080/sync?id=2') # yield生成器,有等待、暂停的功能
raise tornado.gen.Return(response) #4、通过requests包来实现异步,都是使用装饰器
class MyHandler(BaseHandler):
executor = ThreadPoolExecutor()
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
response = yield self.func()
self.write(response.text) @run_on_executor
def func(self):
res = requests.get('http://127.0.0.1:8080/sync?id=2')
return res application = tornado.web.Application(
handlers=[
(r'/abc',AbcHandler),
(r'/sync', SyncHandler),
(r'/call', CallbcakHandler),
(r'/gen', GenHandler),
(r'/func', FuncHandler),
(r'/my', MyHandler), ],
template_path = 'templates',
static_path= 'static',
autoescape = None,
ui_methods=util.ui_methods,
ui_modules=util.ui_modules,
cookie_secret = 'lidang',
login_url = '/login',
pycket = {
'engine':'redis',
'storage':{
'host':'localhost',
'port':6379,
'db_sessions':5,
'db_notifications':11,
'max_connections':2 ** 33,
},
'cookie':{
'expires_days':38,
'max_age':100
}
},
debug=True
) if __name__ == '__main__':
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

tornado 11 异步编程的更多相关文章

  1. 使用tornado的gen.coroutine进行异步编程

    在tornado3发布之后,强化了coroutine的概念,在异步编程中,替代了原来的gen.engine, 变成现在的gen.coroutine.这个装饰器本来就是为了简化在tornado中的异步编 ...

  2. C++11 使用异步编程std::async和std::future

    先说明一点:std::asyanc是std::future的高级封装, 一般我们不会直接使用std::futrue,而是使用对std::future的高级封装std::async. 下面分别说一下. ...

  3. 《深入理解ES6》笔记—— Promise与异步编程(11)

    为什么要异步编程 我们在写前端代码时,经常会对dom做事件处理操作,比如点击.激活焦点.失去焦点等:再比如我们用ajax请求数据,使用回调函数获取返回值.这些都属于异步编程. 也许你已经大概知道Jav ...

  4. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  5. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  6. [C#] 走进异步编程的世界 - 开始接触 async/await

    走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...

  7. 深入解析js异步编程利器Generator

    我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就 ...

  8. [C#] 走进异步编程的世界 - 剖析异步方法(上)

    走进异步编程的世界 - 剖析异步方法(上) 序 这是上篇<走进异步编程的世界 - 开始接触 async/await 异步编程>(入门)的第二章内容,主要是与大家共同深入探讨下异步方法. 本 ...

  9. [C#] 走进异步编程的世界 - 剖析异步方法(下)

    走进异步编程的世界 - 剖析异步方法(下) 序 感谢大家的支持,这是昨天发布<走进异步编程的世界 - 剖析异步方法(上)>的补充篇. 目录 异常处理 在调用方法中同步等待任务 在异步方法中 ...

随机推荐

  1. javascript使用技巧总结,不断更新...

    1.使用a标签来获得当前页面相对地址的绝对地址 function getAbsoluteUrl(url){ var a; if(!a) a = document.createElement('a'); ...

  2. Opencv3 Mat对象构造函数与常用方法

    构造函数 Mat() Mat(int rows,int cols,int type) Mat(Size size,int type) Mat(int rows,int cols,int type,co ...

  3. Hadoop对数据仓库的影响

    转载http://www.dwway.com/portal.php?mod=view&aid=9065 在过去三年,Hadoop生态系统已经大范围扩展,很多主要IT供应商都推出了Hadoop连 ...

  4. Java 基于spring 暴露接口 供外部调用

    在springmvc的配置文件添加创建如下的bean: <!-- 暴露一个webService连接 --> <bean class="org.springframework ...

  5. coordinatewise 是什么意思?

    As far as I remember, in the context of optimization, "coordinate wise" means that you are ...

  6. linux下mariadb的下载与卸载

    Linux下mariadb的安装 使用阿里云的mariadb yum install mariadb-server mariadb -y 启动mariadb数据库 systemctl start/st ...

  7. OpenCV2.3.0在VS中的配置

    本文为cherish总结,这里先收藏着了啦啦啦!!! vs中配置时尽量在全局配置中修改,否则每次新建项目都需要重新配置全局配置步骤如下:1.“视图”菜单 -> (其他窗口->)属性管理器 ...

  8. WordCountPro

    github项目地址:https://github.com/Hoyifei/SQ-T-Homework-WordCount-Advanced PSP表格   PSP2.1 PSP阶段 预估耗时 (分钟 ...

  9. Java WEB中的HttpServletResponse数据传递

    1.什么是HttpServletResponse 2.使用HttpServletResponse向浏览器发送数据及相关实例. 实例1:实现文件下载功能 实例2:实现验证码注册 实例3:实现页面3秒后跳 ...

  10. LibreOJ 6003 魔术球 (最大流)

    题解:每次加入两个点,对于和为平方数的两个值所对应的点建边,反正网络流可以跑残量网络,所以就没有什么关系了…… 代码如下: #include<cmath> #include<queu ...