1

マスター python プログラム内から、次のコードで子プログラムを生成しています。

child = subprocess.Popen(..., stdout=subprocess.PIPE, stdin=subprocess.PIPE)

FWIW、子はPythonプログラムとやり取りする必要があるPHPスクリプトです。

マスター python プログラムは、実際には他のいくつかのチャネルからの通信をリッスンする必要があります。同じコードを使用して生成された他の PHP スクリプト、または からのソケット オブジェクトですsocket.accept()select.select()ソースの。

私が抱えている問題は、select.select()Windows ではサブプロセスの stdout ファイル記述子 (これは文書化されています) で動作しないことです。

  • A) PHP スクリプトをポーリングして、stdout に何かが書き込まれているかどうかを確認します。(このシステムは非常に応答性が高い必要があります。1 秒あたり少なくとも 1,000 回ポーリングする必要があります!)
  • B) PHP スクリプトをマスター プロセスに接続し、stdout/stdin の代わりにソケットを介して通信します。

システムをそれほど頻繁にポーリングすることはできないため、おそらく解決策(B)を使用しますが、標準出力/標準入力がうまく機能したときにソケットに再接続するのはリソースの悲しい無駄のようです。

stdoutと を使用できる代替ソリューションはありselect.select()ますか?

4

1 に答える 1

4

残念ながら、Windows でのパイプの多くの使用法は、Unix での使用ほどうまく機能しません。これもその 1 つです。Windows では、マスター プログラムにスレッドを生成させて、その各サブプロセスをリッスンさせることをお勧めします。サブプロセスから返されると予想されるデータの粒度がわかっている場合は、各スレッドでブロック読み取りを行うことができ、IO がブロック解除されたときにスレッドが有効になります。

別の方法として (これがあなたのプロジェクトで実行可能かどうかはわかりません)、select.select()サブプロセス パイプで動作する Unix ライクなシステム、または Windows 上の Unix ライクなレイヤー (Cygwin など) の使用を検討することもできます。

于 2009-10-07T23:49:49.653 に答える