bash スクリプトをプラグインとして実行する必要がある Python フレームワークがあります。multiprocessing モジュールを使用して、multiprocessing.JoinableQueue からプラグインの詳細を取得し、subprocess.Popen() を使用してプラグインを実行するワーカー プロセスを作成しています。
シェル スクリプトによって生成された最終出力が切り捨てられ、最終的に実行全体が無駄になることが確認されています。
そこで、シェル スクリプト プロセスを生成するサブプロセス メカニズムを維持するワーカーを Python スレッドに移行しようとしました。そして切り捨てはもはや起こっていませんでした。しかし、スレッドは非常に遅く (GIL が原因)、シグナルとイベントへの応答も不確定です (おそらく GIL リリースのタイミングが原因です)。
マルチプロセッシングモジュールがstdoutのバッファリングを行うというスタックオーバーフローの他の質問を含む多くの場所で読みました。これが問題であることはわかっています。しかし、シェルスクリプトがファイルにエコーしなければならないデータに対して sys.stdout.flush を python から与えることができないため、適切な解決策を見つけることができません。
また、いくつかのサンプルで os.fsync を試しましたが、切り捨ては発生していません。ここでも、シェル スクリプトによって作成されたファイルの名前がフレームワークに認識されないため、この目的のために直接使用することはできません。フレームワークによって最終的なアーカイブのみが取り戻されます。
私の質問は、マルチプロセッシング モジュールから生成されたプロセスでこのバッファリングを防ぐ方法はありますか? ここで、Python インタープリターの -u オプションが役立ちますか? または、/usr/lib64/python2.6/multiprocessing の python ライブラリを変更すると、この問題は解決しますか?