龙卷风马达和tornado.concurrency

时间:2013-06-26 18:53:04

标签: python mongodb twisted tornado

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

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

0 个答案:

没有答案