マシンのコア全体で並列に実行される既存の Python コードがあります。それが完了する仕事は、基本的に入力ファイルを開き、内容を読み取り、かなり重い計算を実行し、結果を出力ファイルに書き込み、for ループで次のファイルを取得して、もう一度実行します。これを多くのコアで並列化するために、ライブラリのPool
関数を利用します。multiprocessing
簡単な例として:
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()
multiprocessing.Pool
この例は、 8 つのコアにわたって機能を実装した方法を示すために使用されています。本質的mp_worker
に、私のコードの関数ははるかに複雑ですが、あなたは私のドリフトを理解しています.
私が取り組んでいるネットワークには、99% の時間アイドル状態になっているマシンがいくつかあることに気付きました。したがって、このコードで自分のローカル コアだけでなく、彼らのコアも利用する方法があるのではないかと考えました。
疑似コードでは、コードは次のようになります。
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)
ローカル マシンと他の IP アドレスの両方を、各マシンで使用するコアの数と共にサーバーとして指定できるようになりました。
私のネットワーク上の他のマシンは私が所有しており、インターネットに接続されていないため、セキュリティ目的で SSH を使用することに煩わされていません。
pathos
グーグルで調べてみると、ライブラリとscoop
ライブラリがこれに役立つ可能性があることに気付きました。pathos
ライブラリと非常によく似たコマンドを持っているようで、multiprocessing
本当に魅力的です。ただし、どちらの場合も、ローカル並列ジョブを分散並列ジョブに変換する方法を示す簡単な例を見つけることができません。multiprocessing
ライブラリのプール/マップ機能にできる限り近づけたいと思っています。
どんな助けや例も大歓迎です!