tornado数据库操作怎么异步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tornado数据库操作怎么异步相关的知识,希望对你有一定的参考价值。

参考技术A 用tornado毕竟是可以做异步request的, 如果你的数据库真的很慢, 不如再开其他的tornado做block数据库操作(你可以用tornado wsgi多线程/多进程形式部署, 也可以用django, flask等), 然后通过API的形式将数据库返回过来. 相当于用tornado给你的数据库操作web化(写内部数据API)

这个是我刚才刚刚想到的, 原理就是用一些独立的进程去做费时的数据库操作, 这样你的主web tornado进程就可以异步畅通, 增加吞吐量. 这样就不需要为各个数据库写驱动了.

如果数据库在不同的机器上, 那么可以考虑将这些独立的数据操作tornado进程在数据库机器上部署. 使用wsgi多线程/多进程的好处是查询可以同时进行, 当然也可能卡死数据库. 使用tornado自己的单进程异步部署的时候, tornado还可以充当一个数据库操作队列的作用.本回答被提问者和网友采纳

在tornado中使用异步mysql操作

在使用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执行完毕再返回数据


































以上是关于tornado数据库操作怎么异步的主要内容,如果未能解决你的问题,请参考以下文章

对Tornado异步操作Sqlalchemy方法的选定 不错

tornado之异步web服务一

Tornado 线程池应用

Python Web框架Tornado的异步处理代码示例

Python Web框架Tornado的异步处理代码演示样例

Tornado使用协程异步访问mysql工具:TorMysql