私はいくつかの子プロセスのstdoutを同時に監視し、stdinも書く必要があるプロジェクトに取り組んでいます。これを実現するために、バックグラウンドスレッド上で動作するイベントループとしてpyuv
を使用し、子プロセスのハンドルを動的に追加します。上記のプロセスをエミュレートするPythonコードは次のとおりです。新しいプロセスを追加した後、直ちにstdoutが出力されます。したがって、私はPythonのREPLメッセージを4回見ます。なぜstdinはイベントループ全体をブロックせずにブロックしますか?
はしかし、私はそれを実行すると、それだけでこのように、吸う:
(env) ➜ _draft git:(pyuv-watcher) ✗ python libuv.py
data --> b'Python 3.5.2 (default, Jun 28 2016, 08:46:01) \n[GCC 6.1.1 20160602] on linux\nType "help", "copyright", "credits" or "license" for more information.\n'
data --> b'>>> '
[nothing then, until 4 seconds later.]
(env) ➜ _draft git:(pyuv-watcher) ✗
をしかし、私はつまり、プロセスの標準入力にデータを書き込む、最後の2行のコメントを解除する場合。それは違う:
(env) ➜ _draft git:(pyuv-watcher) ✗ python libuv.py
data --> b'Python 3.5.2 (default, Jun 28 2016, 08:46:01) \n[GCC 6.1.1 20160602] on linux\nType "help", "copyright", "credits" or "license" for more information.\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
data --> b'Python 3.5.2 (default, Jun 28 2016, 08:46:01) \n[GCC 6.1.1 20160602] on linux\nType "help", "copyright", "credits" or "license" for more information.\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
data --> b'Python 3.5.2 (default, Jun 28 2016, 08:46:01) \n[GCC 6.1.1 20160602] on linux\nType "help", "copyright", "credits" or "license" for more information.\n'
data --> b'>>> '
data --> b'>>> '
data --> b'4\n'
data --> b'4\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
data --> b'Python 3.5.2 (default, Jun 28 2016, 08:46:01) \n[GCC 6.1.1 20160602] on linux\nType "help", "copyright", "credits" or "license" for more information.\n'
data --> b'>>> '
data --> b'4\n'
data --> b'>>> '
(env) ➜ _draft git:(pyuv-watcher) ✗
唯一の標準入力にデータを書き込むことなくプロセスハンドルを追加した場合、標準入力待ちプロセスは、プロセス全体をブロックしますようです。これはどうですか?そして、1つのイベントループで異なるプロセスと同時に対話する方法は?
ありがとうございます!私はpyuv.Asyncでこの問題を解決し、スレッド間の操作を避けました。 [コード使用中](https://github.com/DemoHn/obsidian-panel/blob/master/process_watcher/process.py#L136) – DemoHn