2013-05-04 14 views
5

Asenkron motorla birlikte tornado ve mongodb ile oynuyorum. Geri arama ile çalışırken her şey yolunda. Sonra sadece bir işlevde bir istek gerçekleştirmek için motor.Op veya tornado.gen.Task kullanma imkanı keşfetti:Db isteği (başka bir işlevde) başka bir işlevde nasıl taşınır?

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") 

Ama bu veritabanını taşımak istediğiniz: Çalışma

Yani bu edilmektedir Başka bir modülde kendi işlevinde istekte bulunabilirsiniz. Sorun şu ki, verimin nasıl çalıştığını gerçekten anlamıyorum (verim hakkında bir sürü soruya rağmen). Yani bu ne denedim, ama işe yaramıyor:

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

Ve başka işlevi çağrısı:

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

Ben pdb ile araştırabilirsiniz

(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 

Herhangi bir yardım takdir , Teşekkürler.

cevap

4

tornado.gen.Return kullanımının this post sayesinde bunu yapmanın başka bir yolunu buldum. Hala ana fonksiyonumda ihtiyacım var, ama coroutine basit.

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

Ve başka işlevi çağrı:

#------ 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) 
İşte

benim şimdi kodudur