0

TWProcessing即興のバッチ マネージャーとして説明できる小さな Python (2.7.2+) モジュール ( と呼ばれる) を作成しました。それが機能する方法は、並行して実行されるコマンドの長いリストを渡すことですが、同時プロセスの総数を制限します。そうすれば、実行したいコマンドが 500 個ある場合、それらすべてをループしますが、マシンを圧倒しないように一度に X 個しか実行しません。X の値は、このバッチ マネージャーのインスタンスを宣言するときに簡単に設定できます (クラスが呼び出されTWBatchManagerます)。

batch = TWProcessing.TWBatchManager(MaxJobs=X)

次に、ジョブのリストをこのオブジェクトに非常に簡単な方法で追加します。

batch.Queue.append(/CMD goes here/)

Queueバッチ マネージャが実行するコマンドのリストはどこにありますか。キューがいっぱいになると、一度にRun()X のみを実行して、すべてのコマンドをループする which を呼び出します。

batch.Run()

これまでのところ、すべて正常に動作しています。今私がやりたいことは、X の値 (つまり、一度に実行されるプロセスの最大数) を動的に、つまりプロセスがまだ実行されている間に変更できるようにすることです。これを行う私の古い方法はかなり簡単でした。クラスが参照することを認識している MAXJOBS というファイルがあり、存在する場合は定期的にチェックして、目的の値が変更されたかどうかを確認します。今度は、もう少しエレガントなものを試してみたいと思います。バッチ マネージャーを含むスクリプトを起動した bash シェルの行に沿って何かを記述しexport MAXJOBS=newX、バッチ マネージャーに、これが使用すべき X の値であることを認識させたいと考えています。これは起動時に読み込まれる辞書であるため、明らかos.environ['MAXJOBS']に私が探しているものではありません。os.getenv('MAXJOBS')exportシェルがそれ以降に生成する子プロセスにのみ影響するため、それもカットしません。したがって、Python スクリプトを起動した親プロセスの環境に戻る方法が必要です。親 pid が表示されることはわかっos.ppidていますが、そこから親環境に移動する方法がわかりません。親シェルが子プロセス環境を変更できる方法があるかどうかを確認するために、interwebz を調べてみましたが、そのようなことをしようとしないでくださいと主張する傾向があることがわかりました。コンピューターでできる最も醜いこと。

これをやってのける方法についてのアイデアはありますか?「標準のテキスト ファイルから読み取る」という私の考えはそれほど醜いものではありませんが、私は Python を初めて使用するので、できるだけ多くのことを学ぶためにエレガントでクリーンな方法で物事を行うように自分自身に挑戦しようとしています。よろしくお願いします。

4

1 に答える 1

2

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

すべての要件について完全にはわかりませんが、FIFO (名前付きパイプ) の候補になる可能性があります。

1) fifo を作成します。

mkfifo batch_control

2) fifo から読み取る python - サーバーを開始します。(注: 以下は最小限の例にすぎません。調整する必要があります。

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

echo3) bash スクリプトから、FIFO に文字列を -ingすることにより、python サーバーに「送信」することができます。

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

Python サーバーの出力は次のとおりです。

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

お役に立てれば。

于 2012-04-12T14:29:40.780 に答える