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实现异步非阻塞相关推荐

  1. 200行自定义异步非阻塞Web框架

    Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...

  2. 真正的 Tornado 异步非阻塞

    其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado. 但是在实际使用过程中很容易把 To ...

  3. 使用tornado让你的请求异步非阻塞

    2019独角兽企业重金招聘Python工程师标准>>> 前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了. ...

  4. tornado异步非阻塞实现方式

    目录 tornado异步非阻塞实现方式 1.多线程 2.老版协程 3.新版协程 实验 1.完全阻塞,同步代码 2.老版本协程 3新版本协程 4 多线程+新版协程,线程函数失效 5.线程+不声明异步,可 ...

  5. Python web框架 Tornado(二)异步非阻塞使用以及原理

    原文: http://www.liangxiansen.cn/2018/04/11/tornado/ 作者: 梁先森 稍有改动 Tornado默认是单进程单线程.实时的web特性通常需要为每个用户一个 ...

  6. 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别

    先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...

  7. 线程同步 阻塞 异步 非阻塞(转)

    同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞:函数立即返回,通过select通知调用者 这样看来异步和非阻 ...

  8. python3 异步 非阻塞 IO多路复用 select poll epoll 使用

    有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...

  9. 处理大并发之一 对异步非阻塞的理解

    处理大并发之一 对异步非阻塞的理解 在研究nginx和node.js的时候常会遇到异步.非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下. 首先讨 ...

最新文章

  1. c语言万年历闹钟程序,c语言编写的万年历 有平年闰年 有闹钟功能.docx
  2. 原创 | 微服务网关 Kong 科普
  3. ListView实现多种item布局的方法和注意事项
  4. hyperv动态内存Linux,Linux 之动态分配内存方式
  5. lodop同一页面一次性打印多次
  6. java ArrayList集合
  7. 部署单台zookeeper
  8. jQuery 梁桐老师笔记 - 选择器
  9. edge 浏览器打开总跳向 hao.360
  10. IntelliJ IDEA 创建Spring+SpringMVC+hibernate+maven项目
  11. Linux安装kermit
  12. Hbase报错解决方法ERROR: KeeperErrorCode = NoNode for /hbase/master
  13. 【SDCC讲师专访】房芳:高德地图开放平台,一场本地生活服务市场入口的争夺战
  14. Linux用户和用户组的管理
  15. python字典键盘添加元素_对python字典元素的添加与修改方法详解
  16. std::string int 转换
  17. RTKLib的Manual基础解读
  18. 什么是BGP多线,与普通双线的区别
  19. 猿辅导获国际科研大奖:深度解析它为何在科研界“混得”风生水起
  20. 反射型XSS靶场练习

热门文章

  1. C案例:打印钻石图形
  2. 关于国际物流货运的冷知识
  3. Android语音便签快速调用-内置录音程序
  4. Python拼音转汉字
  5. 主设备号--驱动模块与设备节点联系的纽带
  6. jQuery(二):jQuery选择器
  7. 电脑开机后内存占用过高(50%以上)
  8. MySQL数据库之索引
  9. 一键免费自动AI抠图,效果连PS大哥也点赞!
  10. 用管理员身份登录oracle数据库