关于 gevent 的 monkey patch

2012-09-09 18:42:45 +08:00
 Livid
如果调用了其他网络库,但是之前没有进行 monkey patch,那么会有哪些恶劣后果呢?
10052 次点击
所在节点    Python
9 条回复
ipconfiger
2012-09-09 19:07:04 +08:00
就是IO会阻塞,性能下降
ratazzi
2012-09-09 19:33:29 +08:00
阻塞,不能切换到其它部分代码的执行
notedit
2012-09-09 22:25:55 +08:00
monkey patch 不只是patch socket 也会patch thread。

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

另外关于 ultramysql,因为他不兼容 DBAPI,所以一些 ORM 都不能用了,可以如此如此 /t/43383

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

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

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

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

© 2021 V2EX