V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhu327
V2EX  ›  Python

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

  •  
  •   zhu327 · 2016-06-19 23:08:06 +08:00 · 4169 次点击
    这是一个创建于 3083 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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/

    第 1 条附言  ·  2016-06-21 00:01:45 +08:00

    https://github.com/zhu327/greentor/tree/master/demo

    搭了一个在Tornado上异步跑Django ORM的demo,仅供参考

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

    你的 TorMySQL 好像是对 IOStream 重写了,有空请教下你这方面的优化哈
    sujin190
        5
    sujin190  
       2016-06-21 12:26:36 +08:00
    @zhu327 没有连接池的话性能起不来吧,连接池还要负责排队,阻塞清除之类的,否则异步很容易挂的
    对,原来的 IOStream 是为了各种情况读写而设计的,太慢了, mysql 协议读写过程很稳定,不需要那么复杂的读写过程,重写之后 cpython 快了近 40%, pypy 上快了 3 倍。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1138 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.