gpt4 book ai didi

python - Tornado 和 Mongodb 阻塞和异步注意事项是什么?

转载 作者:行者123 更新时间:2023-11-28 17:47:56 25 4
gpt4 key购买 nike

我正在结合 Mongodb 运行 Tornado 网络服务器(使用 pymongo 驱动程序)。我正在努力做出架构决策以最大限度地提高性能。

当同时使用 Tornado 和 pymongo 时,我有几个关于结果应用程序的阻塞/非阻塞和异步方面的子问题:

问题一:连接池

pymongo.mongo_client.MongoClient 对象似乎自动实现了一个连接池。 “连接池”的预期目的是让我可以从不同线程同时访问 mongodb 吗?如果从单个线程使用单个 MongoClient 实例运行,是否真的没有“池”,因为任何时候都只有一个连接打开?

问题2:多线程Mongo调用

以下常见问题解答:

http://api.mongodb.org/python/current/faq.html#does-pymongo-support-asynchronous-frameworks-like-gevent-tornado-or-twisted

状态:

Currently there is no great way to use PyMongo in conjunction with Tornado or Twisted. PyMongo provides built-in connection pooling, so some of the benefits of those frameworks can be achieved just by writing multi-threaded code that shares a MongoClient.

所以我假设我只是将单个 MongoClient 引用传递给每个线程?或者还有更多吗?当每个线程产生结果时触发回调的最佳方式是什么?我应该让一个线程运行谁的工作是观察队列(python 的 Queue.Queue)来处理每个结果,然后在左边调用 finish() open RequestHandler Tornado 中的对象? (当然需要使用 tornado.web.asynchronous 装饰器)

问题3:多实例

最后,我有没有可能只是在创作作品?我是否应该通过运行 Tornado 的单线程实例然后为每个内核启动 3-4 个实例来简化事情? (上面的 FAQ 引用似乎暗示了这一点)

毕竟 python 中的 GIL 不会导致有效的不同进程吗?或者 Tornado 的“非阻塞”方面是否有额外的性能考虑(加或减)? (我知道这在 I/O 方面是非阻塞的,正如这里指出的:Is Tornado really non-blocking?)

(附加说明:我知道 asyncmongo 位于:https://github.com/bitly/asyncmongo,但我想直接使用 pymongo 而不是引入此附加依赖项。)

最佳答案

据我了解,网络服务器有两个概念:

  1. 基于线程(apache)
  2. 事件驱动( Tornado )

而且你有 python 的 GIL,GIL 不适合线程,而事件驱动是一种只使用一个线程的模型,所以选择事件驱动。

Pymongo 将阻止 Tornado ,所以这里是建议:

  1. 使用 Pymongo:使用它,通过创建索引使您的数据库调用更快,但要注意;索引不适用于将扫描大量值的操作,例如:gte
  2. 使用AsyncMongo , 似乎已经更新了,但仍然不是所有的 mongodb 特性。
  3. 使用Mongotor ,这个就像是 Asynchmongo 的更新,它有 ODM(对象文档映射器),有你从 MongoDB 需要的一切(聚合、副本集..),你真正想念的唯一功能是 GridFS。
  4. 使用Motor ,这是一个,是与 Tornado 一起使用的完整解决方案,它具有 GridFS 支持,并且它是 Tornado 的官方 Mongodb 异步驱动程序,它使用了一个黑客 Greenlet ,所以唯一的缺点是不能与 PyPy 一起使用。

现在,如果您决定使用 Tornado 以外的其他解决方案,如果您使用 Gevent,那么您可以使用 Pymongo,因为 it is said :

The only async framework that PyMongo fully supports is Gevent.

注意:对不起,如果跑题了,但是句子:

Currently there is no great way to use PyMongo in conjunction with Tornado

应该从文档中删除,Mongotor 和 Motor 以完美的方式工作(尤其是 Motor)。

关于python - Tornado 和 Mongodb 阻塞和异步注意事项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15350907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com