在 Tornado 上异步调用 pymysql 的思路,可以类比实现其它网络 IO 库的异步调用

2016-06-19 23:08:06 +08:00
 zhu327

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/

4019 次点击
所在节点    Python
5 条回复
sujin190
2016-06-20 22:39:31 +08:00
其实想 tornado 想这样异步使用 mysql 虽说可以,但真要想用在生产环境,还是要做很多要调整的,异步使用 mysql 和同步有很多不一样的地方
https://github.com/snower/TorMySQL
我实现的,已用在生产环境中,数百并发,每天千万流量下稳定运行。
zhu327
2016-06-21 00:00:13 +08:00
@sujin190 如果只是纯粹用 mysql 的话就直接用你的这个了,之前也 star 过,但是我的目标是在 Tornado 中无感知的使用 Django ORM ,所以需要把整个 get 方法的都放到 greenlet 中去。这样就不需要 yield ,能使用 Django ORM 。
sujin190
2016-06-21 09:25:37 +08:00
@zhu327 好想法,不过 django 是线程安全的么?没注意他文档中怎么写的,包括内部的连接池之类的,如果异步 mysql 没有连接池支持的话会性能更低吧,我只看过早先版本的 django 连接池实现,好像不能支持这种情况吧
zhu327
2016-06-21 11:44:49 +08:00
@sujin190 Django ORM 是线程安全的,没有连接池,只有一个连接保持的机制

你的 TorMySQL 好像是对 IOStream 重写了,有空请教下你这方面的优化哈
sujin190
2016-06-21 12:26:36 +08:00
@zhu327 没有连接池的话性能起不来吧,连接池还要负责排队,阻塞清除之类的,否则异步很容易挂的
对,原来的 IOStream 是为了各种情况读写而设计的,太慢了, mysql 协议读写过程很稳定,不需要那么复杂的读写过程,重写之后 cpython 快了近 40%, pypy 上快了 3 倍。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286891

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX