首先,当我需要从三个不同的集合中进行查询时,如何简化语法:
@gen.coroutine
def _prepare_comment_extra(self, extra):
(material, _), _ = yield gen.Task(self.db["material"].find_one,
{"_id": extra["material_id"]})
(course, _), _ = yield gen.Task(self.db["course"].find_one,
{"_id": extra["course_id"]})
(theme, _), _ = yield gen.Task(self.db["theme"].find_one,
{"_id": extra["theme_id"]})
raise gen.Return({
"material": material,
"course": course,
"theme": theme})
对我而言,它看起来非常令人生畏。有没有办法更清楚地写出来?
第二个问题是关于使用带有tornado.concurrent的电机。我发现在ThreadExecutor中使用电机操作是不可能的。它引发异常“无法切换到下一个线程”。我知道,ThreadExecutor被指定用于以异步方式执行阻塞任务。但是,我们能否以相同的连接在同步模式下执行电机?
最后的问题: 如果我们在run_on_executor函数中使用add_callback会发生什么?我们会退出ThreadExecutor,不是吗?
class SomeClass(...):
@tornado.concurrent.run_on_executor
def test_fun(self, *a, **kw):
....
....
self.io_loop.add_callback(lambda : partial(fn, *args, **kwargs)
...
...