Tornado是一个异步框架,在异步操作的时候能提升程序的处理性能。但是如果在程序中碰到同步的逻辑,由于GIL的关系,会直接卡死,导致性能急剧下降。

目前对于mongodb以及redis都有比较不错的异步框架,但是对于Mysql,目前的异步框架都不是很成熟。

在实际应用中,由于一开始不是特别了解,在用了Tornado框架的同时,采用了Sqlalchemy来处理Mysql数据。但是由于这部分Mysql操作是同步的,在并发量上去的时候,不能及时返回,大量请求被拒绝。

由于替换Sqlalchemy会造成很大的工作量,经过研究之后发现Tornado有run_on_executor,可以利用线程池达到异步化的目的。

Decorator to run a synchronous method asynchronously on an executor.

The decorated method may be called with a callback keyword argument and returns a future.

The IOLoop and executor to be used are determined by the io_loop and executor attributes of self. To use different attributes, pass keyword arguments to the decorator

#!/bin/env python
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
import tornado.gen
from tornado.concurrent import run_on_executor
# 这个并发库在python3自带;在python2需要安装sudo pip install futures
from concurrent.futures import ThreadPoolExecutor
import time
from tornado.options import define, options
define("port", default=8002, help="run on the given port", type=int)

class SleepHandler(tornado.web.RequestHandler):
executor = ThreadPoolExecutor(2)

def get(self):
tornado.ioloop.IOLoop.instance().add_callback(self.sleep) # 这样将在下一轮事件循环执行self.sleep
self.write("when i sleep")

@run_on_executor
def sleep(self):
time.sleep(5)
print("yes")
return 5

if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[
(r"/sleep", SleepHandler), ])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

当然也可以用celery来达到异步的效果,但是不如run_on_executor来的方便
---------------------
作者:harleylau
来源:CSDN
原文:https://blog.csdn.net/harleylau/article/details/77899148
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. IE 6 全球分布图 - 中国一枝独秀
  2. 《Java学习笔记(第8版)》学习指导
  3. 部署samba服务之后,在客户端用挂载访问的方式,错误信息:mount: block device //192.168.1.108/mysqldata is write-protected, mounting read-only mount: cannot mount block device //192.168.1.108/mysqldata read-only
  4. C#之GDI+
  5. Android自动化压力测试之Monkey Test (三)
  6. Js获取后台集合List的值和下标的方法
  7. Linux Tcpdump 使用举例 ---持续更新
  8. 修改ubuntu按下关机键触发的事件
  9. cobbler部署
  10. WebSite 文件上传Demo
  11. BZOJ 1087
  12. hdu4734(数位dp)
  13. VSCode 配置
  14. 微服务之分布式跟踪系统(springboot+pinpoint)
  15. 实习番外篇:解决C语言使用Makefile无法实现更好的持续集成问题
  16. Oracle的静默安装 升级和卸载 参考规范
  17. 搭建企业级NFS网络文件共享服务说明[一]
  18. C语言—第二次作业
  19. python3之json模块使用
  20. java 获取 获取某年某月 所有日期(yyyy-mm-dd格式字符串)

热门文章

  1. C++异常安全
  2. 一张图看懂CSS cascade, specific, importance, inheritance
  3. SVNKit学习——Setting Up A Subversion Repository 创建仓库(三)
  4. Eclipse 中 SVN 提交过滤
  5. XML布局之路
  6. linux下 signal信号机制的透彻分析与各种实例讲解
  7. liunx screen使用简单实验
  8. 解决Unity3D操作界面字体模糊的问题
  9. 019sys模块
  10. 服务容错处理库Polly使用