2013-05-04 4 views
5

私は、非同期ドライバモーターを使って、竜巻とmongodbで遊んでいます。 コールバックを操作するときは、問題ありません。他の関数でdb要求(yieldを使用)を移動するにはどうすればよいですか?

class Contact_handler(Main_handler): 

    @web.asynchronous 
    @gen.coroutine 
    def get(self, other_id): 

     event = events.Event_send_contact_request(self.user_id) 
     result = yield motor.Op(db.users.update, 
        {'_id': ObjectId(other_id)}, 
        {'$push': {'evts': event.data}} 
        ) 

     self.finish("ok") 

しかし、私は、このデータベースを移動したいと思います。だから、これが働いている

:その後、私は1つの関数に要求を実行するためにmotor.Opまたはtornado.gen.Taskを使用する可能性を発見しました別のモジュールで独自の機能で要求します。問題は、私が実際に歩留まりがどのように働いているのか理解していないことです(私が歩留まりに関する多くの質問を読んだにもかかわらず)。 これは、私が試したものですが、それは働いていない:

#------ file views.py ------------- 

class Contact_handler(Main_handler): 

    def get(self, other_id): 

     event = events.Event_send_contact_request(self.user_id) 
     result = model.push_event_to_user(other_id, event) 

     self.finish("ok") 

そして、別の関数での呼び出し:

#------ file model.py ------------- 

@gen.coroutine 
def push_event_to_user(user_id, event): 

    ## Ajout de la demande dans les events du demandé: 
    yield motor.Op(db.users.update, 
        {'_id': ObjectId(user_id)}, 
        {'$push': {'evts': event}} 
        ) 

私はPDBで調査している場合:

(Pdb) l 
157    event = events.Event_send_contact_request(self.user_id) 
158    result = model.push_event_to_user(other_id, event) 
159    
160    import pdb; pdb.set_trace() 
161    
162 ->   self.finish("ok") 
163   

(Pdb) result 
<tornado.concurrent.TracebackFuture object at 0xa334b8c> 
(Pdb) result.result() 
*** Exception: DummyFuture does not support blocking for results 

感謝すべてのヘルプ、ありがとう。

答えて

4

これは、this postの使用により、tornado.gen.Returnという別の方法が見つかりました。私はまだ私の主な機能で降伏する必要がありますが、コルーチンは簡単です。ここで

は私のコードは以下のようになります。

#------ file views.py ------------- 

@web.asynchronous 
@gen.coroutine 
class Contact_handler(Main_handler): 

    def get(self, other_id): 

     event = events.Event_send_contact_request(self.user_id) 
     result = yield model.push_event_to_user(other_id, event) 

     self.finish("ok") 

そして、別の関数での呼び出し:

#------ file model.py ------------- 

@gen.coroutine 
def push_event_to_user(user_id, event): 

    ## Ajout de la demande dans les events du demandé: 
    result = yield motor.Op(db.users.update, 
          {'_id': ObjectId(user_id)}, 
          {'$push': {'evts': event}} 
          ) 
    raise gen.Return(result) 
関連する問題