【问题标题】:What exactly is wrong with using pymongo in twisted?在 twisted 中使用 pymongo 到底有什么问题?
【发布时间】:2014-08-28 20:32:23
【问题描述】:

我有一个扭曲的服务器应用程序,它与大约 1000 个客户端保持持久连接。每个客户端偶尔会向我的扭曲服务器发送数据,我希望该服务器将数据存储到 MongoDB 数据库中。到目前为止,一切顺利。

但是,pymongo 文档指出“没有好方法可以将 pymongo 与 twisted 一起使用”。我不明白为什么不。有人可以解释一下到底是什么问题以及陷阱是什么?我认为这与 pymongo 同步有关,但我想做的只是将一些东西推入数据库。

如果我在文件 connector.py 中声明了一个 pymongo.MongoClient 实例,然后我将连接器导入到运行我的 Twisted 工厂和协议的主 python 文件中,我应该能够使用该 pymongo 实例。 MongoClient 在每个 Protocol(连接到每个客户端)中将数据存储到数据库中。

那么到底是什么问题呢?显然我有点困惑。

【问题讨论】:

    标签: python mongodb twisted pymongo


    【解决方案1】:

    简而言之:pymongo 调用是阻塞的,运行时它们会冻结扭曲的引擎,直到调用返回,这对扭曲的内部状态是随机破坏的,因为它与扭曲的设计目的相反。

    相反,您应该寻找类似的扭曲驱动程序,例如tx-mongo。 tx-mongo 的受众比 pymongo 少,所以它的文档比较粗糙,但你应该能够在它的 example 目录中找到所有你需要的东西。

    背景:Threading vs Event programing

    【讨论】:

    • 好的,谢谢。但我所做的只是使用 collection.insert 函数在集合中插入一个文档。我不需要看到这个调用的结果——它只是一劳永逸。假设我将此调用包装在来自 python 线程库的线程中。这还会导致问题吗?
    • 线程不太可能有帮助,除非你因为GIL而运行CPython以外的东西。如果您的应用程序有大量的余量,您可能可以通过调用 pymongo 侥幸逃脱,只是它会以非常不可预测和不优雅的方式失败(如果您忘记了自己以这种方式作弊,则需要进行调试)。 github.com/fiorix/mongo-async-python-driver 是我过去很幸运的扭曲的本地 mongo 驱动程序,在你做你以后会后悔的事情之前先看看。
    • 线程可能会有所帮助,因为 GIL 是围绕 CPython 标准库中实现的阻塞 I/O 操作发布的。从本质上讲,如果您正在使用 Twisted,就如同您使用 Twisted(换句话说,Twisted不会让线程变得更糟,只是不会让它们变得更好)。
    猜你喜欢
    • 2015-06-08
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2018-06-23
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多