2012-04-12 14 views
0

私は、即時バッチマネージャとして記述できる少しの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の初心者ですので、可能な限り学ぶためにエレガントでクリーンな方法で自分自身に挑戦しようとしています。あなたの助けを前にありがとう。

答えて

2

私にとっては、bashスクリプトとpythonプログラム間のプロセス間通信を求めているようです。

私はすべての要件について完全にわからないんだけど、FIFO(名前付きパイプ)の候補であるかもしれない:

1)FIFOます

mkfifo batch_control 

2)を起動しますpython - fifoから読み込んだサーバ。(注:以下は、最小限の例であり、あなたは物事を適応させる必要があります。

while True: 
    fd = file("batch_control", "r") 
    for cmd in fd: 
     print("New command [%s]" % cmd[:-1]) 
    fd.close() 

3)あなたがFIFOにecho -ing文字列でのpythonサーバーに物事を「送信」することができますよりも、bashスクリプトから:

$ echo "newsize 800" >batch_control 
$ echo "newjob /bin/ps" >batch_control 

のpythonサーバーの出力は次のようになります。

New command [newsize 800] 
New command [newjob /bin/ps] 

は、この情報がお役に立てば幸いです。

+0

お返事ありがとうございました。私はFIFOを考慮していましたが、それは本当に優れた解決策です。私がそのようにすれば、あなたの答えは私にとって大きな助けになります。同僚はソケットを提案しましたが、これは私が気に留めていた他のアプリケーションのためにも私には大いに役立ちます。しかし、心配しないで、私はあなたの答えを保持しています、そして、私が最終的にFIFOで遊び始めたとき、それは私には大いに役立ちます。もう一度ありがとう:) – ticster

+0

私はまた、ソケットを使用すると思った。ソケットの利点は、異なるサーバー間でも使用できることです。つまり、FIFOは1台のサーバーからしか使用できません。ソケットの欠点は、bashスクリプトから物事を処理するには多少の努力が必要だということです。 –

+0

それは確かですが、この小さなプロジェクトのポイントは、ほとんどが自分自身を学習し、挑戦することです。そして、私がソケットでやりたいと思っていたことがいくつかありました。だから私は今のところ彼らと一緒に行くと思う。 – ticster

関連する問題