tornado实现异步非阻塞
1、使用 tornado.gen.coroutine 异步编程(需要第三方库支持tornado异步)
同步阻塞
code
# coding=utf-8 # @Time : 2020/11/3 15:40 # @Author : Leo # @Email : l1512102448@qq.com # @File : demo_tornado_asy.pyimport tornado.web import tornado.ioloop import tornado.gen as gen import timeclass LeoHandler(tornado.web.RequestHandler):"""Tornado同步"""# @gen.coroutinedef get(self):print(1)# 异步执行# yield gen.sleep(10)time.sleep(10)print(2)self.write("hello")if __name__ == '__main__':app = tornado.web.Application([(r"/leo", LeoHandler),])app.listen(8888)tornado.ioloop.IOLoop.current().start()
ab接口压力测试结果
控制台可以看出请求是阻塞状态
异步非阻塞
- code
# coding=utf-8
# @Time : 2020/11/3 15:40
# @Author : Leo
# @Email : l1512102448@qq.com
# @File : demo_tornado_asy.pyimport tornado.web
import tornado.ioloop
import tornado.gen as gen
import timeclass LeoHandler(tornado.web.RequestHandler):"""异步的延时10秒接口,gen.sleep支持Tornado异步"""@gen.coroutinedef get(self):print(1)# 异步执行yield gen.sleep(10)print(2)self.write("hello")if __name__ == '__main__':app = tornado.web.Application([(r"/leo", LeoHandler),])app.listen(8888)tornado.ioloop.IOLoop.current().start()
- ab接口压力测试结果
控制台结果表明请求是异步的,没有被阻塞
2、基于线程的异步编程
使用 tornado.gen.coroutine 装饰器编写异步函数,如果库本身不支持异步,那么响应仍然是阻塞的。
在 Tornado 中有个装饰器能使用 ThreadPoolExecutor 来让阻塞过程变成非阻塞,其原理是在 Tornado 本身这个线程之外另外启动一个线程来执行阻塞的程序,从而让 Tornado 变得非阻塞。
code
class LeoThreadHandler(tornado.web.RequestHandler):'''基于线程实现异步非阻塞'''# 必须定义一个executor的属性,然后run_on_executor 注解才管用。executor = ThreadPoolExecutor(max_workers=10)@run_on_executordef sleep_fun(self):time.sleep(5)@gen.coroutinedef get(self):print(1)# 异步执行yield self.sleep_fun()print(2)self.write("hello") if __name__ == '__main__':app = tornado.web.Application([(r"/leo", LeoThreadHandler),])app.listen(8888)tornado.ioloop.IOLoop.current().start()
ab压力测试结果
- 分析
虽然tornado.gen.coroutine结合线程池实现了异步非阻塞, 但是与之而来的问题是,如果大量使用线程化的异步函数做一些高负载的活动,会导致该 Tornado 进程性能低下响应缓慢,这只是从一个问题到了另一个问题而已。
所以在处理一些小负载的工作,是能起到很好的效果,让 Tornado 异步非阻塞的跑起来。
3、基于 Celery 的异步编程
4、 python的原生协程关键字:Async和Await
前言
- Async用来声明一个函数为异步函数
异步函数的特点是能在函数执行过程中挂起,去执行其他异步函数,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。
Await 用来声明程序挂起,挂起后继续执行
code
class AsynchronousSleepHandler(tornado.web.RequestHandler):'''python的原生协程关键字:Async和Await实现异步'''async def get(self):print(1)await asyncio.sleep(5)print(2)self.write("hello") if __name__ == '__main__':app = tornado.web.Application([(r"/leo", AsynchronousSleepHandler),])app.listen(8888)tornado.ioloop.IOLoop.current().start()
ab压力测试结果
tornado实现异步非阻塞相关推荐
- 200行自定义异步非阻塞Web框架
Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...
- 真正的 Tornado 异步非阻塞
其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado. 但是在实际使用过程中很容易把 To ...
- 使用tornado让你的请求异步非阻塞
2019独角兽企业重金招聘Python工程师标准>>> 前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了. ...
- tornado异步非阻塞实现方式
目录 tornado异步非阻塞实现方式 1.多线程 2.老版协程 3.新版协程 实验 1.完全阻塞,同步代码 2.老版本协程 3新版本协程 4 多线程+新版协程,线程函数失效 5.线程+不声明异步,可 ...
- Python web框架 Tornado(二)异步非阻塞使用以及原理
原文: http://www.liangxiansen.cn/2018/04/11/tornado/ 作者: 梁先森 稍有改动 Tornado默认是单进程单线程.实时的web特性通常需要为每个用户一个 ...
- 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别
先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...
- 线程同步 阻塞 异步 非阻塞(转)
同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞:函数立即返回,通过select通知调用者 这样看来异步和非阻 ...
- python3 异步 非阻塞 IO多路复用 select poll epoll 使用
有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...
- 处理大并发之一 对异步非阻塞的理解
处理大并发之一 对异步非阻塞的理解 在研究nginx和node.js的时候常会遇到异步.非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下. 首先讨 ...
最新文章
- c语言万年历闹钟程序,c语言编写的万年历 有平年闰年 有闹钟功能.docx
- 原创 | 微服务网关 Kong 科普
- ListView实现多种item布局的方法和注意事项
- hyperv动态内存Linux,Linux 之动态分配内存方式
- lodop同一页面一次性打印多次
- java ArrayList集合
- 部署单台zookeeper
- jQuery 梁桐老师笔记 - 选择器
- edge 浏览器打开总跳向 hao.360
- IntelliJ IDEA 创建Spring+SpringMVC+hibernate+maven项目
- Linux安装kermit
- Hbase报错解决方法ERROR: KeeperErrorCode = NoNode for /hbase/master
- 【SDCC讲师专访】房芳:高德地图开放平台,一场本地生活服务市场入口的争夺战
- Linux用户和用户组的管理
- python字典键盘添加元素_对python字典元素的添加与修改方法详解
- std::string int 转换
- RTKLib的Manual基础解读
- 什么是BGP多线,与普通双线的区别
- 猿辅导获国际科研大奖:深度解析它为何在科研界“混得”风生水起
- 反射型XSS靶场练习