確かに、例えば:
from multiprocessing import Process, Queue
thelist = range(1000*1000)
def f(q, sublist):
q.put(sum(sublist))
def main():
start = 0
chunk = 500*1000
queue = Queue()
NP = 0
subprocesses = []
while start < len(thelist):
p = Process(target=f, args=(queue, thelist[start:start+chunk]))
NP += 1
print 'delegated %s:%s to subprocess %s' % (start, start+chunk, NP)
p.start()
start += chunk
subprocesses.append(p)
total = 0
for i in range(NP):
total += queue.get()
print "total is", total, '=', sum(thelist)
while subprocesses:
subprocesses.pop().join()
if __name__ == '__main__':
main()
結果:
$ python2.6 mup.py
delegated 0:500000 to subprocess 1
delegated 500000:1000000 to subprocess 2
total is 499999500000 = 499999500000
この粒度は細かすぎて、プロセスを生成する価値がないことに注意してください -- 全体的な合計タスクは小さく (これが、チェックとして main で合計を再計算できる理由です;-) あまりにも多くのデータが前後に移動されています (実際、サブプロセスは作業対象のサブリストのコピーを取得する必要はありません -- インデックスで十分です)。したがって、これはマルチプロセッシングが実際に保証されていない「おもちゃの例」です。ただし、さまざまなアーキテクチャ (キューから実行する複数のタスクを受け取るサブプロセスのプールを使用する、前後のデータ移動を最小限に抑えるなど) を使用し、粒度の低いタスクでは、パフォーマンスの面で実際にメリットを得ることができます。