2016-12-19 7 views
0

私はいくつかの子プロセスの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つのイベントループで異なるプロセスと同時に対話する方法は?

答えて

0

あなたは、おそらく未定義の動作が発生している可能性があります。 libuv(拡張子pyuv)はスレッドセーフではありません。つまり、バックグラウンドスレッドでループを実行して、別のスレッドからハンドルを追加することはできません。

+0

ありがとうございます!私はpyuv.Asyncでこの問題を解決し、スレッド間の操作を避けました。 [コード使用中](https://github.com/DemoHn/obsidian-panel/blob/master/process_watcher/process.py#L136) – DemoHn

関連する問題