当然可以,例如:
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 中的总和作为检查;-)并且来回移动了太多数据(在事实上,子进程不需要获取他们处理的子列表的副本——索引就足够了)。因此,这是一个“玩具示例”,其中并不真正需要多处理。但是,使用不同的架构(使用从队列接收多个任务以执行的子进程池、最小化来回数据移动等)以及在粒度较小的任务上,您实际上可以获得性能方面的好处。