まず、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)
...
...