在使用tornado框架进行开发的过程中,发现tornado的mysql数据库操作并不是一步的,造成了所有用户行为的堵塞.tornado本身是一个异步的框架,要求所有的操作都应该是异步的,但是数据库这一层就把整个服务器都拖住了.

##查找到的解决办法:

  1. 使用异步的mysql操作库. 查找了一下,有两个比较完善的异步操作库
    一个是AsyncTorndb,国人自己写的异步操作,看了一下,好像不错的样子,但是没有响应的测试用例,不敢用.

    一个是Tornado-MySQL是对PyMySQL的异步化的一个库,测试用例,文档,都比较齐全,可以尝试使用.

2.仿照(torngas)[https://github.com/mqingyn/torngas]的异步线程池,使用tornado的concurrent.run_on_executor装饰器对数据库操作进行异步化

3.使用任务队列,太过麻烦,对之前的代码修改过大,不使用该方案

  • 在使用Tornado-MySQL过程中,发现对现有代码更改太过严重,放弃,使用了异步线程池的方式.做到最小的代码更改以及异步数据库操作的实现

##如何使用异步线程池concurrent.run_on_executor

  1. 在原先的同步的数据库执行的方法添加@concurrent.run_on_executor装饰器,如以下例子:

    1
    2
    3
    4
    5
    6
    7
    @concurrent.run_on_executor
    def runSql(self):
    t = time.time()
    db = client.conn()
    db.execute('''select * from TABLE_CONSTRAINTS join (CHARACTER_SETS,STATISTICS)''')
    db.close()
    return time.time() - t
  1. 在调用该方法的函数使用yield tornado.gen.Task(functionName) 调用上面的修改的方法,并且为主函数添加@tornado.gen.engine装饰器,如以下例子(tordona框架中的requestHander中的get方法):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self, *args, **kwargs):
    # print self.get_query_argument("test11")
    time = yield tornado.gen.Task(self.runSql)
    print time
    self.write(unicode(time))
    print "over"
    self.finish()

    *使用@tornado.web.asynchronous 装饰器取消requestHander的自动finish,不然无法等待异步sql执行完毕再返回数据

最新文章

  1. C语言 右左法则
  2. Windows Phone 一、XAML基础语法
  3. 解决ListView和ScrollView同时使用时滑动的冲突问题
  4. sqlmap查找SQL注入漏洞入门
  5. explicit关键字
  6. java学习——java中的反射学习笔记
  7. IDEA中Git的使用
  8. shell脚本实现冒泡排序
  9. WebGL&Three.js工作原理
  10. CodeSignal 刷题 —— almostIncreasingSequence
  11. 从Elasticsearch来看分布式系统架构设计
  12. jquery Load方法的重要点
  13. Spearman Rank(斯皮尔曼等级)相关系数
  14. ELK之Logstash使用useragent获取浏览器版本、型号以及系统版本
  15. LINUX 笔记5
  16. matplotlib.pyplot的两种模式
  17. JavaScript中如何判断两变量是否“相等”?
  18. ArcGIS 10.2 三维分析工具箱部分工具不能用
  19. [React + Functional Programming ADT] Create Redux Middleware to Dispatch Multiple Actions
  20. share point CSOM 客户端模式 创建 list

热门文章

  1. 谈谈CSS性能
  2. scrum心得和团队作业
  3. myEclipse mybatis自动生成工具xml配置
  4. 【Leetcode】【Medium】Rotate Image
  5. docker commit 显示“invalid reference format”
  6. HTML5新增功能
  7. [零基础学JAVA]Java SE基础部分-02.标识符、数据类型
  8. hdu-3074 Multiply game---线段树+单点更新
  9. [POI2015]KIN
  10. php 多种输入参数完整性检查