簡體   English   中英

如何運行 Tornado 的 IOLoop 的多個實例?

[英]How can I run multiple instances of Tornado's IOLoop?

我有用 Tornado 編寫的基本 web 服務器。 現在,我想添加一些需要數據庫連接的功能。 我選擇了帶有電機庫的 MongoDB。 在遵循官方教程之后,我的main.py的相關部分看起來像:

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()

按照教程,它指出我現在可以使用IOLoop.current().run_sync(do_find_one)運行do_find_one 但是,如果我這樣做:

tornado.ioloop.IOLoop.current().start()
tornado.ioloop.IOLoop.current().run_sync(do_find_one)

它不會改變任何東西,也看不到足夠的結果,但是如果切換行,例如:

tornado.ioloop.IOLoop.current().run_sync(do_find_one)
tornado.ioloop.IOLoop.current().start()

我收到以下錯誤:

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() function ,然后在LoginHandlerget方法中await它嗎?

我怎樣才能讓服務器工作,同時對數據庫進行操作?

這些IOLoop可以在同一個線程上運行,還是我需要創建多個線程(每個IOLoop一個或類似的線程)?

當循環開始時,您應該能夠await異步 function 而不必知道當前的異步循環是哪個。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM