我正在与 Mongodb 一起运行 Tornado Web 服务器(使用 pymongo 驱动程序)。我正在尝试做出架构决策以最大限度地提高性能。
当一起使用 Tornado 和 pymongo 时,我有几个关于结果应用程序的阻塞/非阻塞和异步方面的子问题:
问题一:连接池
该pymongo.mongo_client.MongoClient
对象似乎自动实现了一个连接池。“连接池”的预期目的是为了让我可以从不同的线程同时访问 mongodb?如果使用单个线程中的单个 MongoClient 实例运行,是否真的没有“池”,因为任何时候都只会打开一个连接?
问题二:多线程Mongo调用
以下常见问题解答:
状态:
目前没有很好的方法将 PyMongo 与 Tornado 或 Twisted 结合使用。PyMongo 提供了内置的连接池,因此这些框架的一些好处可以通过编写共享 MongoClient 的多线程代码来实现。
所以我假设我只传递一个MongoClient
对每个线程的引用?或者还有更多的东西吗?当每个线程产生结果时触发回调的最佳方法是什么?我是否应该让一个线程运行谁的工作是观察一个队列(python Queue.Queue
)来处理每个结果,然后在 Tornado 中调用finish()
左侧打开的对象?RequestHandler
(当然tornado.web.asynchronous
需要使用装饰器)
问题 3:多个实例
最后,有没有可能我只是在创作作品?我是否应该通过运行 Tornado 的单线程实例来简化事情,然后每个核心启动 3-4 个实例?(上面的常见问题参考似乎暗示了这一点)
毕竟,python 中的 GIL 不会导致有效的不同进程吗?或者 Tornado 的“非阻塞”方面是否有额外的性能考虑(正负)?(我知道这在 I/O 方面是非阻塞的,正如这里指出的那样: Tornado 真的是非阻塞的吗?)
(附加说明:我知道 asyncmongo 在: https ://github.com/bitly/asyncmongo 但想直接使用 pymongo 而不是引入这个额外的依赖。)