私は、即時バッチマネージャとして記述できる少しのPython(2.7.2+)モジュール(TWProcessing
)を作成しました。それが動作する方法は、コマンドの長いリストを渡して、並列で実行するが、同時プロセスの総数を制限することです。そうすれば、私は500のコマンドを実行したいと思うなら、すべてをループしますが、マシンを圧倒しないように一度にXを実行するだけです。Pythonでの親プロセスの再読み込み環境
batch = TWProcessing.TWBatchManager(MaxJobs=X)
私は、非常に簡単な方法で、このオブジェクトにジョブのリストを追加します。Xの値は、簡単にこのバッチマネージャ(クラスはTWBatchManager
と呼ばれている)のインスタンスを宣言するときに設定することができます
batch.Queue.append(/CMD goes here/)
Queue
は、バッチマネージャが実行するコマンドのリストです。キューがいっぱいになると、私は、一度にXを実行し、すべてのコマンドをループRun()
を呼び出す:
batch.Run()
はこれまでのところ、すべてが正常に動作します。今私がしたいのは、プロセスがまだ実行中のときに、Xの値(すなわち、一度に実行されるプロセスの最大数)を動的に変更できることです。私のこれまでのやり方はかなり簡単でした。私はMAXJOBSという名前のファイルを見ていました。もし存在すれば、定期的にチェックして、希望の値が変わったかどうかを確認します。もう少しエレガントなものを試してみたい。
export MAXJOBS=newX
の行に沿って、バッチマネージャーを含むスクリプトを起動したバッシュシェルに何かを書き込んで、バッチマネージャーにこれが今使っているはずのXの値であることを認識させたいと思います。明らかに、
os.environ['MAXJOBS']
は、起動時に読み込まれる辞書なので、私が探しているものではありません。
export
はシェルが起動する子プロセスにのみ影響するため、
os.getenv('MAXJOBS')
はそれを切断しません。私の必要なのは、私のpythonスクリプトを起動した親プロセスの環境に戻る方法です。私は
os.ppid
が私に親pidを与えるだろうと知っていますが、そこから親環境にどのように到達するか分かりません。私は、親のシェルが子プロセス環境を変更する方法があるかどうかを調べるためにウェブを突き刺しました。そして、人々は私がそのようなことを試してはいけないと主張しがちです。コンピュータでできることの最も醜いもののうちの1つです。
これを解消する方法はありますか?私の "標準テキストファイルからの読み込み"という考えはあまりにも醜いわけではありませんが、私はPythonの初心者ですので、可能な限り学ぶためにエレガントでクリーンな方法で自分自身に挑戦しようとしています。あなたの助けを前にありがとう。
お返事ありがとうございました。私はFIFOを考慮していましたが、それは本当に優れた解決策です。私がそのようにすれば、あなたの答えは私にとって大きな助けになります。同僚はソケットを提案しましたが、これは私が気に留めていた他のアプリケーションのためにも私には大いに役立ちます。しかし、心配しないで、私はあなたの答えを保持しています、そして、私が最終的にFIFOで遊び始めたとき、それは私には大いに役立ちます。もう一度ありがとう:) – ticster
私はまた、ソケットを使用すると思った。ソケットの利点は、異なるサーバー間でも使用できることです。つまり、FIFOは1台のサーバーからしか使用できません。ソケットの欠点は、bashスクリプトから物事を処理するには多少の努力が必要だということです。 –
それは確かですが、この小さなプロジェクトのポイントは、ほとんどが自分自身を学習し、挑戦することです。そして、私がソケットでやりたいと思っていたことがいくつかありました。だから私は今のところ彼らと一緒に行くと思う。 – ticster