https://github.com/zhu327/greentor
在 demo 目录下有一个调用 pymysql 的例子,看似与同步调用没什么区别,也没用用 yield ,实际上在通过打补丁的形式使用 Tornado 的 IOStream 替换掉了 pymyslq 的 socket ,并且使用 greenlet 中断当前的同步调用,在 IOStream 回调的时候唤醒 greenlet 继续执行。
思路来自于gTronado
关键的实现逻辑参考这篇文章:
https://emptysqua.re/blog/motor-internals-how-i-asynchronized-a-synchronous-library/
https://github.com/zhu327/greentor/tree/master/demo
搭了一个在Tornado上异步跑Django ORM的demo,仅供参考
1
sujin190 2016-06-20 22:39:31 +08:00
其实想 tornado 想这样异步使用 mysql 虽说可以,但真要想用在生产环境,还是要做很多要调整的,异步使用 mysql 和同步有很多不一样的地方
https://github.com/snower/TorMySQL 我实现的,已用在生产环境中,数百并发,每天千万流量下稳定运行。 |
2
zhu327 OP @sujin190 如果只是纯粹用 mysql 的话就直接用你的这个了,之前也 star 过,但是我的目标是在 Tornado 中无感知的使用 Django ORM ,所以需要把整个 get 方法的都放到 greenlet 中去。这样就不需要 yield ,能使用 Django ORM 。
|
3
sujin190 2016-06-21 09:25:37 +08:00
@zhu327 好想法,不过 django 是线程安全的么?没注意他文档中怎么写的,包括内部的连接池之类的,如果异步 mysql 没有连接池支持的话会性能更低吧,我只看过早先版本的 django 连接池实现,好像不能支持这种情况吧
|
4
zhu327 OP |