Tornado Asynchronous Handler

前端 未结 3 873
半阙折子戏
半阙折子戏 2020-12-09 21:10

I am attempting to implement get_current_user in the RequestHandler for Tornado, but I need the call to block while waiting on the asynchronous call to my database. Decorat

相关标签:
3条回答
  • 2020-12-09 21:53

    Do a blocking database operation instead of the non blocking described above (There is a blocking mysql lib shipped with tornado).

    From the Tornado wiki page about threads and concurrency: "Do it synchronously and block the IOLoop. This is most appropriate for things like memcache and database queries that are under your control and should always be fast. If it's not fast, make it fast by adding the appropriate indexes to the database, etc."

    https://github.com/facebook/tornado/wiki/Threading-and-concurrency

    0 讨论(0)
  • 2020-12-09 21:56

    How about having get_current_user return a Future that you signal when the asynchronous response from your database is returned?

    class BaseHandler(tornado.web.RequestHandler):
        def get_current_user(self):
            future = Future()
            def query_cb(user):
                future.set_result(user or None)
            database.get(username='test', password='t3st', callback=query_cb)
            return future
    
    
    class MainHandler(BaseHandler):
        @gen.coroutine
        def get(self):
            user = yield self.get_current_user()
            self.write('user: ' + user)
            # ... actual request processing
    
    0 讨论(0)
  • 2020-12-09 22:02

    I thought Tornado allowed you to make either blocking or non-blocking requests.

    Here is Tornado being used for both: https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py

    Disclaimer: I know very little of Python and Tornado.

    0 讨论(0)
提交回复
热议问题