私のマシンのコア全体で並列に動作するPythonコードの既存ビットがあります。完成した仕事は、基本的に入力ファイルを開き、内容を読み、かなり重い数学を実行し、結果をファイルに出力し、forループの次のファイルを取り出してもう一度やります。これを多くのコアにわたって並列化するには、multiprocessing
ライブラリのPool
関数を使用します。簡単な例として:Pythonの分散型マルチプロセッシングプール
import multiprocessing
import time
data = (
['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
)
def mp_worker((inputs, the_time)):
print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
time.sleep(int(the_time))
print " Process %s\tDONE" % inputs
def mp_handler():
p = multiprocessing.Pool(8)
p.map(mp_worker, data)
if __name__ == '__main__':
mp_handler()
この例では、ちょうど私が8つのコア間multiprocessing.Pool
機能を実装しました方法を示すために使用されています。本質的に私のコード内のmp_worker
関数ははるかに複雑ですが、あなたは私のドリフトを取得します。
私が取り組んでいるネットワークには、時間の99%がアイドル状態になっているマシンがいくつかあることに気づきました。したがって私は、このコードで自分のコアとローカルコアを利用する方法があるのかどうか疑問に思っていました。
私はそれぞれに使用したいコア数と一緒に切断するように私は今、私のローカルマシンと他のIPアドレスの両方を指定することができますdef mp_handler():
p = multiprocessing.Pool(servers=['local host', 192.168.0.1, 192.168.0.2], ncores=[8,8,4])
p.map(mp_worker, data)
:
擬似コードでは、コードは次のようになる可能性機械。
私のネットワーク上の他のマシンは私に所有されており、インターネットに接続されていないため、セキュリティ上の目的でSSHを使用することについて騒がしいことはありません。
私は、pathos
とscoop
ライブラリが私にこれを手伝ってくれるかもしれないことに気付きました。 pathos
には、私にとって本当に魅力的なmultiprocessing
ライブラリに非常によく似たコマンドがあります。しかし、どちらの場合でも、ローカル並列ジョブを分散並列ジョブに変換する方法を示す簡単な例は見つかりません。私は可能な限りmultiprocessing
ライブラリのプール/マップ機能の近くに滞在したいと思っています。
ご迷惑をおかけして申し訳ございません。
チェックアウトhttps://wiki.python.org/moin/ParallelProcessing – mata