在之前的章节中,我们见识了如何用线程实现并发的应用。本章节将会介绍基于进程的并行。本章的重点将会集中在Python的 multiprocessing 和 mpi4py 这两个模块上。
multiprocessing
mpi4py
multiprocessing 是Python标准库中的模块,实现了共享内存机制,也就是说,可以让运行在不同处理器核心的进程能读取共享内存。
mpi4py 库实现了消息传递的编程范例(设计模式)。简单来说,就是进程之间不靠任何共享信息来进行通讯(也叫做shared nothing),所有的交流都通过传递信息代替。
这方面与使用共享内存通讯,通过加锁或类似机制实现互斥的技术行成对比。在信息传递的代码中,进程通过 send() 和 receive 进行交流。
send()
receive
在Python多进程的官方文档中,明确指出 multiprocessing 模块要求,使用此模块的函数的main模块对子类来说必须是可导入的( https://docs.python.org/3.3/library/multiprocessing.html )。
__main__ 在IDLE中并不是可以导入的,即使你在IDLE中将文件当做一个脚本来运行。为了能正确使用此模块,本章我们将在命令行使用下面的命令运行脚本: :
__main__
python multiprocessing example.py
这里, multiprocessing_example.py 是脚本的文件名。本章使用的解释器是Python3.3(实际上使用Python2.7也是可以的)。
multiprocessing_example.py
>>> from multiprocessing import Pool >>> p = Pool(5) >>> def f(x): ... return x*x ... >>> p.map(f, [1,2,3]) Process PoolWorker-1: Process PoolWorker-2: Process PoolWorker-3: Traceback (most recent call last): AttributeError: 'module' object has no attribute 'f' AttributeError: 'module' object has no attribute 'f' AttributeError: 'module' object has no attribute 'f'
In [1]: from multiprocessing import Pool In [2]: p = Pool(5) In [4]: import func In [5]: p.map(func.f, [1,2,3]) Out[5]: [1, 4, 9]
译者注结束)
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8