【问题标题】:Does Motorengine mantain an IO stream with mongo db?Motor Engine 是否使用 mongodb 维护 IO 流?
【发布时间】:2015-06-04 10:48:27
【问题描述】:

我想在我的 Tornado 应用程序中使用 Motorengine。正如docs 中给出的,这就是我应该如何制作 ODM

from motorengine.document import Document
from motorengine.fields import StringField, DateTimeField

class Article(Document):
    title = StringField(required=True)
    description = StringField(required=True)
    published_date = DateTimeField(auto_now_on_insert=True)

    new_title = "Better Title %s" % uuid4()

def create_article():
    Article.objects.create(
        title="Some Article",
        description="This is an article that really matters.",
        callback=handle_article_created
    )

def handle_article_created(article):
   article.title = new_title
   article.save(callback=handle_article_updated)

def handle_article_updated(article):
    Article.objects.find_all(callback=handle_articles_loaded)

def handle_articles_loaded(articles):
    assert len(articles) == 1
    assert articles[0].title == new_title
    articles[0].delete(callback=handle_article_deleted)

def handle_article_deleted(number_of_deleted_items):
    try:
        assert number_of_deleted_items == 1
    finally:
        io_loop.stop()

io_loop.add_timeout(1, create_article)
io_loop.start()

令人困惑的是,一旦创建实例,这是否会保持与数据库的一致连接?我想要对所有模型的数据库进行非阻塞 I/O 操作,所以如果它这样做不是问题。但是我不应该为用户模型实现它,我在验证时只会访问一次。是否有访问用户数据的正常方法?

另外,我还不清楚一些事情:

  1. 最后两行(ioloop)到底在做什么?

  2. 我在单独的文件中声明不同的模型,我是否对每个文件都做一个io_loop.start()?这是我觉得很奇怪的部分。

请帮帮我。谢谢。

【问题讨论】:

    标签: tornado tornado-motor


    【解决方案1】:

    阅读 MotorEngine 的代码,在我看来,您对 MongoDB 执行的每个操作,例如 Article.objects.create,都会检查 MotorClient 实例并尽可能重用一个实例。这是连接被缓存并从缓存中查找的位置:

    https://github.com/heynemann/motorengine/blob/master/motorengine/connection.py#L62

    每个MotorClient 都维护一个持久的 IOStream 池,因此您的问题的答案是肯定的。

    IOLoop.start 启动您的应用程序服务器。您应该在一个文件中调用一次。对start 的调用将永远运行,或者直到您终止该进程。

    add_timeout 调用只是演示 MotorEngine 功能的一种方式,它会等待一秒钟然后调用create_article。您不会在实际应用程序中做类似的事情;你可能会直接在RequestHandler 中调用create_article,而不是add_timeout

    【讨论】:

    • 非常感谢。仍然没有答案的一件事 - 如果我不想要一个持久池,我该如何查询用户?
    • 确实想要一个持久池。 =) 不要一直支付重新连接的费用。
    • 所以你的意思是说持久连接不是内存上的额外负载?如果这听起来很愚蠢,我很抱歉。我是网络套接字的新手。
    • 我们不是在讨论 Web 套接字,而是在讨论驱动程序用来连接到 MongoDB 的标准 TCP 连接。在您的程序中花费的 CPU 和建立 TCP 连接的内核之间,以及您的机器和服务器之间建立连接所需的几次往返,更不用说slow start,几乎总是首选保持连接尽可能长寿。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多