5

我正在使用异步驱动电机玩龙卷风和 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

任何帮助表示赞赏,谢谢。

4

1 回答 1

4

由于这篇使用tornado.gen.Return的帖子,我找到了另一种方法。我仍然需要在我的 main 函数中让步,但是协程很简单。

这是我现在的代码:

#------ 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)
于 2013-05-05T09:53:07.700 回答