pymongo + gevent:给我一个香蕉直接猴子补丁?

13 投票
2 回答
4743 浏览
提问于 2025-04-17 00:13

这里有个小问题,我对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时,发现了几个需要注意的地方:

  1. 只创建一个 pymongo.Connection 对象,最好把它设为全局变量或者模块级别的变量。这很重要,因为 Connection 自带一个连接池!
  2. 要对所有东西进行猴子补丁,至少要对socket和线程都进行补丁。因为 Connection 使用了线程局部变量,仅仅补丁socket是不够的。
  3. 记得调用 end_request,这样才能把连接还回连接池。

你的问题的答案是,可以放心使用,PyMongo和Gevent配合得很好。

撰写回答