我正在玩龙卷风和mongodb,使用异步驱动电机。 使用回调时一切都很好。然后我发现有可能使用motor.Op或tornado.gen.Task来仅在一个函数中执行请求:
所以这是有效的:
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
感谢任何帮助,谢谢。
答案 0 :(得分: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)