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
Livid
V2EX  ›  Python

关于 gevent 的 monkey patch

  •  
  •   Livid · 2012-09-09 18:42:45 +08:00 · 10173 次点击
    这是一个创建于 4487 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果调用了其他网络库,但是之前没有进行 monkey patch,那么会有哪些恶劣后果呢?
    9 条回复    1970-01-01 08:00:00 +08:00
    ipconfiger
        1
    ipconfiger  
       2012-09-09 19:07:04 +08:00
    就是IO会阻塞,性能下降
    ratazzi
        2
    ratazzi  
       2012-09-09 19:33:29 +08:00
    阻塞,不能切换到其它部分代码的执行
    notedit
        3
    notedit  
       2012-09-09 22:25:55 +08:00
    monkey patch 不只是patch socket 也会patch thread。

    我见过最恶劣的后果就是多个协程共享一个socket连接,每个协程获取的数据不是它想要的。
    chuangbo
        4
    chuangbo  
       2012-09-10 10:15:42 +08:00
    会产生灾难啊。。。
    同一个进程内所有 gevent 协程阻塞,整个应用立即从高并发变成1并发。
    另外还有一些情况是无法 patch 的,比如 mysql-python 这样使用了 libmysqlclient 的库,io 使用的是系统的 socket,而不是 python 中的 _socket,monkey patch 就对其无效了,只要是数据库 IO,就会堵住整个应用。
    chuangbo
        5
    chuangbo  
       2012-09-10 10:16:52 +08:00
    其实用了协程这样的东西,比如 eurasia3, tornado, gevent,都要处处小心各种 IO,包括读写文件打开外部进程什么的,尤其是各种第三方库,不兼容协程就无法使用。
    Livid
        6
    Livid  
    MOD
    OP
       2012-09-10 11:08:15 +08:00
    @chuangbo 所以如果要在 gevent 程序里连 MySQL,貌似 umysql 是个好选择?
    Livid
        7
    Livid  
    MOD
    OP
       2012-09-10 13:39:59 +08:00
    @chuangbo 而且,貌似如果用的是 ESN 的 umysql / umemcache 系列的话,都不需要在开始的时候 from gevent import monkey; monkey.patch_all() 了?
    phuslu
        8
    phuslu  
       2012-09-10 14:59:32 +08:00
    chuangbo
        9
    chuangbo  
       2012-09-10 18:54:32 +08:00
    @Livid @phuslu 说的是对的。

    另外关于 ultramysql,因为他不兼容 DBAPI,所以一些 ORM 都不能用了,可以如此如此 /t/43383
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 02:13 · PVG 10:13 · LAX 18:13 · JFK 21:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.