tornado框架基础11-tornado异步
01 同步和异步
生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗?
同步
含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系
现象:有一个共同的时钟,按来的顺序一个一个处理
直观感受 :就是需要等候,效率低下
异步
含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位
现象:没有共同的时钟,不考虑顺序来了就处理
直观感受:就是不用等了,效率高
02 阻塞和非阻塞
同样是刚才排队的情形,当你在排队的同时,你的状态是怎样的呢?在计算机里面应该怎么描述呢?
阻塞调用与非阻塞调用
阻塞调用
含义 : 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回
现象:读套接字时没有数据等数据来,写套接字时写不下了也一直等,等能写下了往里写(套接字被写满的原因不在本地,在于网络另一头的套接字被写满了来不及读出去,导致本地的套接字内容来发不出去堵住了)
直观感受:执着
非阻塞调用
含义 :非阻塞调用是指没有调用结果立即返回,当前线程不被挂起,可以继续做其它工作
现象:读套接字时没有数据,不等直接返回干别的事去,写套接字写不下了也不写了,直接返回干别的事去
直观感受:勤奋
03 异步编程
三种方式:协程,回调函数,requests
在前面的介绍的基础上,来看下 Tornado 中,当同时有多个请求发送过来时,而且其中还有请求发生阻塞,会产生什么样的后果呢?
通过回调函数来实现异步
import tornado.httpclient
class CallbackHandler(BaseHandler): """通过回调函数来实现异步"""
@tornado.web.asynchronous
def get(self):
client = tornado.httpclient.AsyncHTTPClient() # 异步的方
client.fetch("http://127.0.0.1:8000/sync",callback=self.on_response) self.write('Ok!'+' ')
def on_response(self,response):
self.write(response.body)
self.finish() # 注意一定要加上,回调的异步完成后不会自动执行finish,所以在这里要手动加上.
通过协程实现异步
导入模块
import tornado.gen
class GenHandler(BaseHandler): """通过协程实现的异步"""
@tornado.web.asynchronous
@tornado.gen.coroutine # coroutine 协程
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
response = yield tornado.gen.Task(client.fetch,"http://127.0.0.1:8000/sync")
self.write(response.body)
通过协程实现异步(自定义函数)
class FuncHandler(BaseHandler): """通过协程实现的异步"""
@tornado.web.asynchronous
@tornado.gen.coroutine # coroutine 协程
def get(self):
response = yield self.func()
print(response)
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:8000/sync")
raise tornado.gen.Return(response)
通过协程来实现异步(使用requests模块)
第一步:安装模块
pip install futures
pip install requests
第二步:导入模块
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor
import requests
通过协程来实现异步(使用requests模块)
class MyFuncHandler(BaseHandler): """通过协程实现的异步"""
executor = ThreadPoolExecutor()
@tornado.web.asynchronous
@tornado.gen.coroutine # coroutine 协程
def get(self):
response = yield self.func()
print(response)
self.write(response.text)
@run_on_executor
def func(self):
response = requests.get("http://127.0.0.1:8000/sync")
return response
tornado框架基础11-tornado异步的更多相关文章
- tornado框架基础10-websocket
websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...
- tornado框架基础01-路由简介
tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...
- tornado框架基础09-cookie和session
01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...
- tornado框架基础08-sqlalchemy表关系和简单登录注册
01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...
- tornado框架基础05-模板继承、UImodul和UImethods
01 模板继承 父模板 <html lang="en"> <head> <meta charset="UTF-8"> ...
- tornado框架基础04-模板基础
01 模板 模板演示 配置路径 在 application 中配置模板文件和静态文件的路径: template_path='templates', static_path='static', 模板 & ...
- tornado框架基础03-请求与响应
01 请求与响应 请求 浏览器在发送请求的时候,会发送具体的请求信息,由请求行,请求消息头,请求正文 请求消息头 向服务器传递附加信息 Accept: 浏览器可以接受的MIME类型. Accept-C ...
- tornado框架基础02-输入和输出
01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...
- tornado框架基础06-SQLAlchemy连接数据库
01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...
随机推荐
- SSM报错:No converter found for return value of type: class java.util.ArrayList at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverter
我使用的是SSM框架,是在编写测试RESTFUL接口的时候出现, @RequestMapping(value = "/selectAll", method = RequestMet ...
- JS获取屏幕的大小
<html><script>function a(){document.write("屏幕分辨率为:"+screen.width+"*" ...
- bzoj 5015 [Snoi2017]礼物
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5015 题解 首先把k=1,k=2,k=3的手推一遍 然后发现一些规律 就是数列可以表示成$a ...
- 线段树+离散化 POJ 2528 Mayor's posters
题目传送门 题意:在一面墙上贴海报,有先后顺序,问最后有多少张不同的海报(指的是没被覆盖或者只是部分覆盖的海报) 分析:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需 ...
- 转 sql 查出一张表中重复的所有记录数据
select * from DB_PATCH awhere lower(a.db_name) in (select lower(db_name) from DB_PATCH group by lowe ...
- C#基础学习2
变量与数据类型!
- 刷ID卡的就餐系统
需求分析:公司旧的考勤系统,缺 “就餐”功能模块,不能查询和统计每天的就餐人数.故需开发一个简易的“刷ID卡的就餐系统”,三 部 分组成,一部分为人事资料的增删改查,二部分为处理从“刷卡就餐机”采集的 ...
- 多路复用IO和异步IO
多路复用I/O 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程. 流程图如下: 当用户进程调用了sel ...
- Database coalesce
coalesce 语法 注意:连接操作符“||”是一个值得注意的例外. 例如,空值加任何值都是空值,空值 乘任何值也都是空值,依此类推. 参数 expression 任何类型的表达式. n 表示可以指 ...
- SQLite – HAVING 子句
SQLite – HAVING子句 HAVING使您能够指定过滤条件哪一组结果出现在最终的结果. WHERE子句的地方条件选定的列, 在有HAVING 子句的地方 就有GROUP BY子句包含的条件组 ...