1

まず、3 つの異なるコレクションからクエリを実行する必要がある場合、構文を単純化するにはどうすればよいでしょうか。

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

私にとって、それは非常に困難に見えます。もっと分かりやすく書く方法はありませんか?!

2 番目の質問は、tornado.concurrent で motor を使用することについてです。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