ローカルコマンドを非同期的にコルーチンとして実行するTornado Webアプリケーションを作成しようとしています。これは、除外されたサンプルコードです。竜巻RequestHandlerからasyncio.subprocess.Processを実行
/path/to/my/script.py
が直接呼び出されると、期待通りに実行されます。また、TestHandler.get
を通常の同期メソッド(run_sync
を参照)として実装すると、正しく実行されます。上記のアプリを実行していると/test
を呼び出すときしかし、ログを示しています
DEBUG:asyncio:Using selector: EpollSelector
DEBUG:asyncio:execute program 'python3' stdout=stderr=<pipe>
DEBUG:asyncio:process 'python3' created: pid 21835
しかし、ps
は、プロセスが絞首刑にすることを示しています
$ ps -ef | grep 21835
berislav 21835 21834 0 19:19 pts/2 00:00:00 [python3] <defunct>
私は右を実装していないよ感じていますループ、または私は間違っているんだけど、examples私が見たところでは、asyncio.get_event_loop().run_until_complete(your_coro())
の使い方を見ていて、asyncioとTornadoを組み合わせることはほとんどできませんでした。すべての提案は歓迎!
こんにちはベン、答えをありがとう!あなたは答えが1つではなく、2つの方向に向いていると指摘しました。両方とも 'AsyncIOMainLoop'を使用しています(asyncio.get_event_loop()。close()を使用して明示的に閉じておく必要があります)もう一方はTornadoの 'Subprocess'です。これは私が気づいていなかったのでもう少し探検する必要があります。後者のドキュメントはそれほど完全ではありません。私の理解は 'stdin' /' stdout'オプションの 'STREAM'オプションを使ってサブプロセスと通信することが可能であるということです、それは正しいのですか? –
はい、ストリームオプションを使用してサブプロセスと通信します。 –