【问题标题】:pymongo + gevent: throw me a banana and just monkey_patch?pymongo + gevent:给我一个香蕉,然后只给我monkey_patch?
【发布时间】:2011-08-24 08:39:52
【问题描述】:

这里需要比我现在更多的 pymongo 领域专业知识:

pymongo 驱动程序的“正确”部分是用 python 编写的,我可以调用 gevent monkey_patch() 并成功地改变 pymongo 在 gevent“异步”greenlets 中的 r/w 阻塞行为吗?

如果这需要在 gevent 和 pymongo 上做更多的工作——但这​​是可行的——只要我能在 irc 上获得一些指导,我就非常愿意投入时间。

谢谢!

注意:在小规模 mongo 写入不是一个大问题,因为我们只是在解除阻塞之前排队写入“请求”。但是与 fiorix 谈论他扭曲的异步 mongo 驱动程序(https://github.com/fiorix/mongo-async-python-driver),即使是 mongo 的快速写入(请求)也可能导致大规模异步应用程序出现问题。 (当然,非阻塞读取可能从一开始就引起问题!)

【问题讨论】:

    标签: python mongodb pymongo monkeypatching gevent


    【解决方案1】:

    我已将 PyMongo 与 Gevent 一起使用,以下是您需要注意的一些事项:

    1. 仅实例化一个pymongo.Connection 对象,最好作为全局或模块级变量。这很重要,因为Connection 内部有一个池!
    2. Monkey 修补所有东西,或者至少同时修补插槽和线程。由于Connection 中使用了线程局部变量,仅修补套接字是不够的。
    3. 记得调用end_request 将连接返回到池中。

    您的问题的答案是继续,PyMongo 与 Gevent 配合得很好。

    【讨论】:

    • 感谢 mongodb google 组的 Bernie Hackett 对此更新:仍然存在一个问题,即 mongo 的连接池上限远低于大多数应用程序将产生的 greenlets 数量。首先使用mongo(1000个greenlets)。此处github.com/mgood/mongo-python-driver 的一些最新 mongodb 补丁试图使 gevent 与 mongo 的线程池很好地配合使用。这是另一个可能有效的补丁示例:code.activestate.com/recipes/….
    • 您是否有或知道任何显示 PyMongo 与 Gevent 一起使用的示例?
    • 下面是另一个可能有效的补丁示例:gist.github.com/1184264
    【解决方案2】:

    在最初的检查中,它似乎没有在 c 代码中执行任何套接字操作,所以应该没问题(阻塞操作应该只是阻塞绿色线程)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多