Motorengine是否使用mongo db保存IO流?

时间:2015-06-04 10:48:28

标签: tornado tornado-motor

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

pg_dump -C --column_inserts -U remoteuser -h remotehost > my_backup.sql

# copy the file to the server you want

# change the desired parameter like the database name
nano my_baskup.sql

createdb -U newuser -h localhost newdb_name
psql -U newuser -h localhost postgres < my_backup.sql

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

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

  1. 最后两行(ioloop)究竟在这做什么?

  2. 我在单独的文件中声明了不同的模型,我是否每个文件都有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() ?这对我来说似乎很奇怪。

  3. 请帮帮我。感谢。

1 个答案:

答案 0 :(得分:2)

阅读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。在实际应用中你不会做那样的事情;您可能会直接在create_article中拨打RequestHandler,而不会add_timeout