2011-06-25 7 views
0

現在、トルネードとasyncmongoを使用してmongodbにアクセスするウェブサイトを作成しています。私のハンドラに1回のリクエストでmongodbへの複数のリクエストを行う必要がある場合を除いて、すべてがうまく動作しています。私はすべてのデータベースを非同期に呼び出すことで、サーバー上にブロッキングがないようにしたいと考えています。トルネードでの非同期リクエストでの複数のデータベース呼び出し

どうすればこの問題を解決できますか?複数のコレクションから異なるドキュメントを取得する必要がある場合がいくつかあります。私は時には、私が最初のクエリから取得したデータを、2番目の外部キーなどの2番目のクエリで使用する必要がある場合もあります。テンプレートをレンダリングするときに、両方のリクエストのデータも必要になります。

ありがとうございます!

答えて

3

各リクエストで異なるコールバックがトリガーされますか?

(私はこれをテストしていないし、asyncmongoに精通していないので、おそらくエラーが含まれています):

import asyncmongo 
import tornado.web 

class Handler(tornado.web.RequestHandler): 

    @tornado.web.asynchronous 
    def get(self, id): 
     self.id = id 
     self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
      port=27107, dbname='mydb') 

     self.db.users.find_one({'username': self.current_user}, 
      callback=self.on_user) 

    def on_user(self, response, error): 
     if error: 
      raise tornado.web.HTTPError(500) 
     self.user = response 
     self.db.documents.find_one({'id': self.id, 'user': self.user}, 
      callback=self.on_document) 

    def on_document(self, response, error): 
     if error: 
      raise tornado.web.HTTPError(500) 
     self.render('template', first_name=self.user['first_name'], 
      document=response) 
+0

このスレッドは安全ですか?私はTornadoがHandlersのインスタンスをどのように処理するかあまり知らない。リクエストごとに新しいものが作成されていますか? – rsnj

+0

はい、リクエストごとに新しいハンドラが作成されます。 Tornadoはスレッドセーフではありません。つまり、メインioloop以外のスレッドからRequestHandlerメソッドを呼び出すことはできません。上の例のようなコールバックは問題ありません。 –

+0

おそらく、ネストコールバックが気に入らなければ、大量のコード(https://groups.google.com/forum/?fromgroups=#!topic/python-tornadoとhttp:// emptysquare)が発生します。 net/motor/pymongo/api/motor/generator_interface.html#generator-interface。特にリンク#2、すべてのクエリが終了してコールバックを実行するのを待ちます。 –

関連する問題