はい、複数のコアを利用するには、各プロセスを異なるプロセスで実行できます。次に例を示します。
from multiprocessing import Process
def add(a,b):
return a+b
def sub(s, t):
return s-t
def mult(y,x):
return y*x
if __name__ == "__main__":
# construct a different process for each function
processes = [Process(target=add, args=(3,4)),
Process(target=sub, args=(3,4)),
Process(target=mult, args=(2,3))]
# kick them off
for process in processes:
process.start()
# now wait for them to finish
for process in processes:
process.join()
特定のコアで特定のプロセスを実行するように強制する必要はありません。 CPUに複数のコアがある場合、OSはそれらのコア全体でプロセスをスケジューリングします。 CPU pinningをここで実行する必要はありません。
上記の例は、複数のコアが関与しているのを見るには単純すぎます。代わりに、この例を試すことができます。この例は、上記の単純なCPUバウンド問題のバリエーションです。つまり、より多くの計算を必要とするバージョンです。
from multiprocessing import Process
def add(a, b):
total = 0
for a1, b1 in zip(a, b):
total = a1 + b1
return total
def sub(s, t):
total = 0
for a1, b1 in zip(s, t):
total = a1 - b1
return total
def mult(y, x):
total = 0
for a1, b1 in zip(y, x):
total = a1 * b1
return total
if __name__ == "__main__":
# construct a different process for each function
max_size = 1000000000
processes = [Process(target=add, args=(range(1, max_size), range(1, max_size))),
Process(target=sub, args=(range(1, max_size), range(1, max_size))),
Process(target=mult, args=(range(1, max_size), range(1, max_size)))]
# kick them off
for process in processes:
process.start()
# now wait for them to finish
for process in processes:
process.join()
あなたtop
出力を見て(とコアを見て1
を押した)場合は、3つのコアが100%(またはそれに近い)で使用されているところ、このようなものが表示されるはずです。これは、CPUのピン割り当てを行う必要はありません。並列化を行うには、OSを信頼する方が簡単です。
あなた自身の質問に部分的に回答したと思います。あなたは 'subprocess'モジュールを使い、' taskset'に必要な引数を渡すことができます。それぞれの関数が独自のスクリプト内にあり、結果を消費できるようにコードを再編成する必要があります。 – dgumo