当然,例如:
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
注意,这粒度太细成为值得产卵过程 - 总求和任务是较小(这是为什么我可以重新计算总数作为支票;-),并且太多数据正在来回移动(事实上,子流程不需要获取他们工作的子列表的副本 - 索引就足够了)。所以,这是一个“玩具的例子”,其中多处理不是真正的保证。但是,对于不同的体系结构(使用从一个队列中接收多个任务的子进程池,最小化数据移动等等)和不太细化的任务,实际上可以在性能方面获得好处。
我觉得这个答案显示了很多聪明才智。通过简单地添加一个间接层不能解决CS中的问题。 – earino 2009-07-25 16:54:24
@earino:OTOH,它根本没有回答OP的问题,具体是关于“如何使用多处理模块”。 – 2009-07-25 18:34:56