2013-05-04 24 views
5

我正在玩龍捲風和mongodb,與異步驅動電機。 使用回調處理一切都很好。後來我發現使用motor.Op或tornado.gen.Task僅在一個函數執行請求的可能性:如何在其他函數中移動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") 

但我想提出這個數據庫在另一個模塊中請求自己的功能。問題是,我不明白這裏的收益率是如何工作的(儘管我讀了很多關於收益率的問題)。 所以這是我試過,但它不工作:

#------ 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

我發現了另一種方法,這要歸功於使用tornado.gen.Returnthis post。我仍然需要在我的主要功能中屈服,但協程很簡單。

這裏是我現在的代碼:

#------ 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) 
相關問題