pymongo + gevent:给我一个香蕉直接猴子补丁?
这里有个小问题,我对pymongo的了解不够,希望能得到一些专业的帮助:
pymongo驱动的“正确”部分是用Python写的吗?这样我就可以调用gevent的monkey_patch(),成功地改变pymongo在gevent“异步”绿色线程中的读写阻塞行为吗?
如果这需要我在gevent和pymongo上多花点时间去研究,但又是可行的,我非常愿意投入时间,只要能在IRC上得到一点指导。
谢谢!
注意:在小规模的情况下,mongo的写入并不是大问题,因为我们只是排队一个写入“请求”,然后再解除阻塞。但是和fiorix讨论他的异步mongo驱动(https://github.com/fiorix/mongo-async-python-driver)时,甚至mongo的快速写入(请求)在大规模的异步应用中也可能会造成问题。(当然,非阻塞读取一开始就可能会引发问题!)
2 个回答
2
从初步检查来看,这段C代码似乎没有进行任何套接字操作,所以应该没问题(阻塞操作只会让绿色线程停下来)。
19
我在使用PyMongo和Gevent时,发现了几个需要注意的地方:
- 只创建一个
pymongo.Connection
对象,最好把它设为全局变量或者模块级别的变量。这很重要,因为Connection
自带一个连接池! - 要对所有东西进行猴子补丁,至少要对socket和线程都进行补丁。因为
Connection
使用了线程局部变量,仅仅补丁socket是不够的。 - 记得调用
end_request
,这样才能把连接还回连接池。
你的问题的答案是,可以放心使用,PyMongo和Gevent配合得很好。