我使用RethinkDB
和Tornado
使用异步方法。根据{{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
函数吗?或者这就是它必须在龙卷风中使用协程?
任何建议将不胜感激。谢谢!
答案 0 :(得分:1)
简单地说:
result = yield new_topic_record
每当你在协程中产生一个Future时,Tornado会暂停协程,直到Future被解析为值或异常。然后Tornado通过传递值或在" yield"中提交异常来恢复协同程序。表达
有关详细信息,请参阅Refactoring Tornado Coroutines。