1

この行を使用して、Java アプリケーションから Python スクリプトを実行しました。

Process process = Runtime.getRuntime().exec("python foo.py", null, directory);

このスクリプトは、Java アプリや他のクライアントと通信する TCP サーバーを実行します。

スクリプトをデバッグしていたとき、あちこちにいくつかのコンソール プリントがあり、すべて問題ありませんでした。スクリプトが Java Code から起動されるとすぐに、TCP サーバーが一定時間応答しなくなりました。しばらくデバッグとフラストレーションを感じた後、スクリプトからプリントを削除したところ、すべてが期待どおりに機能しました。

プロセスの標準出力とエラー ストリームにメモリが割り当てられているようです。それを消費しないと、フル バッファに書き込もうとしてプロセスがスタックします。

標準出力ストリームを消費する必要がないようにプロセスを起動する方法は? デバッグのために出力を保持したいのですが、必要のないストリームを読み取るスレッドを開始したくありません。

4

3 に答える 3

2

子プロセスの出力を消費する必要があります。そうしないと、出力バッファーがいっぱいになるため、最終的にブロックされます (stderr も忘れないでください)。Java プログラムを変更してそれを消費させたくない場合は、スクリプトにフラグを追加してデバッグを完全にオフにするか、少なくともファイル (/dev/null の可能性があります) にリダイレクトすることができます。

于 2012-01-04T19:28:19.680 に答える
1

Java は ProcessBuilder を公開します。これは、必要なことを実行するために使用できるものです。これは fork-exec を実行し、出力とエラー ストリームを処理することもできます。

プロセスがハングするのは Java が原因ではありません。ストリームがいっぱいで、誰もそれを消費していないためにプロセスがブロックされるという標準的な問題です。

ストリームを読み取るスレッドで ProcessBuilder を使用してみてください。

于 2012-01-04T19:30:11.820 に答える
0

過去に同様のことを行い、プロセスの終了をプロセスに関連する特定のファイルログにリダイレクトしました。後で何が起こっているかを見ることができます。また、Python スクリプトのトレースを維持できます。

于 2012-01-04T19:46:10.827 に答える