1

首先,当我需要从三个不同的集合中查询时,如何简化语法:

@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)
         ...
         ...
4

0 回答 0