如何从tornado.ioloop.IOLoop实例返回值add_future方法

时间:2016-05-05 00:56:30

标签: python tornado rethinkdb coroutine

我使用RethinkDBTornado使用异步方法。根据{{​​1}}中的数据模型,在为RethinkDB表插入记录后,我还必须将新记录更新/插入topic表。这是我的帖子请求处理程序的基本设置。

user_to_topic

在插入操作完成后,class TopicHandler(tornado.web.RequestHandler): def get(self): pass @gen.coroutine def post(self, *args, **kwargs): # to establish databse connection connection = rth.connect(host='localhost', port=00000, db=DATABASE_NAME) # Thread the connection threaded_conn = yield connection title = self.get_body_argument('topic_title') # insert into table new_topic_record = rth.table('Topic').insert({ 'title': topic_title, }, conflict="error", durability="hard").run(threaded_conn) # {TODO} for now assume the result is always written successfully io_loop = ioloop.IOLoop.instance() # I want to return my generated_keys here io_loop.add_future(new_topic_record, self.return_written_record_id) # do stuff with the generated_keys here, how do I get those keys def return_written_record_id(self, f): _result = f.result() return _result['generated_keys'] 对象返回结果Future通过RethinkDB方法插入操作,我可以使用Future.result()属性检索新记录的id结果。根据{{​​1}} document,我可以在回调函数generated_keys中执行结果。当然我可以在我的Tornado函数中执行所有其他数据库操作,但是可以将所有id返回到我的return_written_record_id函数吗?或者这就是它必须在龙卷风中使用协程?

任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

简单地说:

result = yield new_topic_record

每当你在协程中产生一个Future时,Tornado会暂停协程,直到Future被解析为值或异常。然后Tornado通过传递值或在" yield"中提交异常来恢复协同程序。表达

有关详细信息,请参阅Refactoring Tornado Coroutines