首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何运行“旋风”的IOLoop的多个实例?

如何运行“旋风”的IOLoop的多个实例?
EN

Stack Overflow用户
提问于 2020-06-05 11:09:48
回答 1查看 180关注 0票数 0

我有一个基本的web服务器用“旋风”写成。现在,我想添加一些需要数据库连接的功能。我选择了带有汽车库的MongoDB。在跟踪官方教程之后,我的main.py的相关部分如下所示:

代码语言:javascript
复制
class LoginHandler(BaseHandler):

    async def get(self):

        db = self.settings['db']
        collection = db.test

        async def do_find_one():
            document =  await collection.find_one({"ime" : "stefan"})
            pprint.pprint(document)

        self.render('login.html')



def main():
    parse_command_line()

    client = motor.motor_tornado.MotorClient('localhost',27017)
    db = client.test
    collection = db.test

    async def do_find_one():
        document =  await collection.find_one({"name" : "John"})
        pprint.pprint(document)

    settings = {
        "template_path": os.path.join(os.path.dirname(__file__),"templates"),
        "cookie_secret": "random_value_goes_here",
        "xsrf_cookies": True,
        "login_url": "/login",
        "db" : db,
        "debug" : True
    }

    app = tornado.web.Application([
        (r'/', WelcomeHandler),
        (r'/login', LoginHandler)
        ],
        **settings
    )

    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()


if __name__ == "__main__":
    main()

下面的教程说明,我现在可以使用do_find_one运行IOLoop.current().run_sync(do_find_one)。不过,如果我这样做的话:

代码语言:javascript
复制
tornado.ioloop.IOLoop.current().start()
tornado.ioloop.IOLoop.current().run_sync(do_find_one)

它不会改变任何东西,也看不到足够的结果,但是如果开关线路,如:

代码语言:javascript
复制
tornado.ioloop.IOLoop.current().run_sync(do_find_one)
tornado.ioloop.IOLoop.current().start()

我得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "main.py", line 108, in <module>
    main()
  File "main.py", line 102, in main
    tornado.ioloop.IOLoop.current().run_sync(do_find_one)
NameError: name 'do_find_one' is not defined

我应该在main中定义do_find_one()函数,然后在LoginHandlerget方法中定义它吗?

如何允许服务器工作,同时对数据库进行操作?

IOLoop的线程可以运行在同一个线程上吗?或者我需要创建多个线程(每个IOLoop或其他线程一个)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 11:40:07

当循环启动时,您应该能够只await异步函数,而不必知道哪个是当前的异步循环。

代码语言:javascript
复制
async def do_find_one(collection):
    document = await collection.find_one({"ime": "stefan"})
    pprint.pprint(document)
    return 8


class LoginHandler(BaseHandler):
    async def get(self):
        db = self.settings["db"]
        val = await do_find_one(collection=db.test)
        print(val)
        self.render("login.html")


handlers = [(r"/", WelcomeHandler), (r"/login", LoginHandler)]


def make_app(settings):
    return tornado.web.Application(handlers, **settings)


def main():
    parse_command_line()
    client = motor.motor_tornado.MotorClient("localhost", 27017)
    db = client.test

    settings = {
        "template_path": os.path.join(os.path.dirname(__file__), "templates"),
        "cookie_secret": "random_value_goes_here",
        "xsrf_cookies": True,
        "login_url": "/login",
        "db": db,
        "debug": True,
    }
    app = make_app(settings)
    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()


if __name__ == "__main__":
    main()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62213981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档