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. rdlc设置指定列隐藏

    此用户帐户对提案名称列不可见

  2. Java,Calendar -- 获取当前日期、当月月初日期、月末日期

    public class CalendarTest { public static void main(String[] args) { // 获取当前年份.月份.日期 Calendar cale = ...

  3. 【总结整理】如何判断伪需求(摘自pmcafe)

    1.客户不会直接提需求,都是给解决方案,所以得到用户的反馈之后,先反推一下是很必要的,为什么客户会有这样的方案 总结:方案不合适 例如:客户只会说我要快马,反推一下,其实客户是想要更快,这样的话,解决 ...

  4. spring 框架jdbc连接数据库

    user=LF password=LF url=jdbc:oracle:thin:@localhost:1521:orcl driver=oracle.jdbc.driver.OracleDriver ...

  5. Linux查看操作系统版本的几种方式

    Linux查看操作系统版本的几种方式: 1.uname -a 2.lsb_release -a 3.cat /etc/issue 4.cat /proc/version 5.cat /etc/redh ...

  6. Python3.7安装PyQt5的方法

    一.系统环境 操作系统:Win7 64位 Python Version:3.7 二.安装参考 方法1:pip install PyQt5 方法2:下载whl安装包安装 a.下载网址:https://p ...

  7. Linux pkg-config命令

    一.简介 pkg-config用来检索系统中安装库文件的信息.典型的是用作库的编译和连接. 二.实例 http://blog.chinaunix.net/uid-20595934-id-1918368 ...

  8. 简单Factory模式

    #pragma once #include "student.h" #include "Teacher.h" typedef enum _EPersonType ...

  9. SP1557 GSS2 - Can you answer these queries II

    一开始看不懂题解,看懂了题解之后觉得还是挺妙的. 好多题解里都提到了HH的项链,但是我觉得关系并不大啊…… 先把所有询问离线下来按照右端点排序,按照询问的要求一个一个加入数字,怎么加入数字,我们设计一 ...

  10. 在使用webstorm打开本地项目文件夹的html文件时,浏览器提示404错误

    错误原因:在使用webstorm打开本地项目文件夹的html文件时,浏览器提示404错误. 错误分析:文件夹命名内包含“+”,此特殊符号导致浏览器解析错误. 改正方案:去掉特殊符号“+”