8

Tornado の RequestHandler に get_current_user を実装しようとしていますが、データベースへの非同期呼び出しを待機している間に呼び出しをブロックする必要があります。@tornado.web.asynchronous で呼び出しを装飾しても機能しません。どちらの方法でも、非同期クエリが完了してクエリ コールバックが実行される前に get_current_user メソッドが返されるためです。

例えば:

class MyHandler(BaseHandler):
  @tornado.web.asynchronous
  @tornado.web.authenticated
  def get(self):
    self.write('example')
    self.finish()

class BaseHandler(tornado.web.RequestHandler):
  def get_current_user(self):
    def query_cb(self, doc):
      return doc or None

    database.get(username='test', password='t3st', callback=query_cb)

@tornado.web.authenticated は get_current_user を呼び出しますが、BaseHandler には応答する時間がないため、常に "None" を受け取ります。トルネードを使用して、上記のような通話を一時的にブロックする方法はありますか?

4

3 に答える 3

4

上記の非ブロッキングではなく、ブロッキング データベース操作を実行します (tornado にはブロッキング mysql lib が同梱されています)。

スレッドと同時実行性に関する Tornado wiki ページから: 「同期的に実行し、IOLoop をブロックします。これは、memcache やデータベース クエリなど、制御下にあり、常に高速である必要がある場合に最も適しています。高速でない場合は、データベースに適切なインデックスを追加するなど。」

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

于 2011-02-08T22:18:15.330 に答える
0

Tornado では、ブロック要求または非ブロック要求のいずれかを行うことができると思いました。

両方に使用されている Tornado を次に示します: https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py

免責事項: 私は Python と Tornado についてほとんど知りません。

于 2011-07-19T14:50:03.927 に答える