1. ホーム
  2. python

[解決済み] Pythonで並列プログラミングを行うには?

2022-03-04 03:46:02

質問

C++では、OpenMPを使って並列プログラミングができますが、PythonではOpenMPは使えません。Pythonのプログラムの一部を並列化したい場合、どうしたらよいでしょうか。

コードの構造としては、以下のように考えられます。

solve1(A)
solve2(B)

ここで solve1solve2 は2つの独立した関数です。このようなコードを順番に実行するのではなく、並列に実行して実行時間を短縮するにはどうしたらよいでしょうか。 そのコードは

def solve(Q, G, n):
    i = 0
    tol = 10 ** -4

    while i < 1000:
        inneropt, partition, x = setinner(Q, G, n)
        outeropt = setouter(Q, G, n)

        if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
            break
            
        node1 = partition[0]
        node2 = partition[1]
    
        G = updateGraph(G, node1, node2)

        if i == 999:
            print "Maximum iteration reaches"
    print inneropt

ここで setinnersetouter は独立した2つの関数です。そこを並列化したいのですが・・・。

どのように解決するのですか?

を使用することができます。 マルチプロセシング モジュールを使用します。この場合、私は処理プールを使うかもしれません。

from multiprocessing import Pool
pool = Pool()
result1 = pool.apply_async(solve1, [A])    # evaluate "solve1(A)" asynchronously
result2 = pool.apply_async(solve2, [B])    # evaluate "solve2(B)" asynchronously
answer1 = result1.get(timeout=10)
answer2 = result2.get(timeout=10)

これは、あなたのために一般的な作業を行うことができるプロセスを生成します。を渡さなかったので processes この場合、マシンの各CPUコアに対して1つのプロセスが生成されます。各CPUコアは同時に1つのプロセスを実行することができます。

リストを1つの関数にマッピングしたい場合は、このようにします。

args = [A, B]
results = pool.map(solve1, args)

スレッドを使用しないのは GIL は、Python オブジェクトに対するあらゆる操作をロックします。