python多进程计算方式

0)把 numbers列表中的每一项输人数据都传给 map
2)用 pickle模块(参见本书第44条)对数据进行序列化,将其变成二进制形式。
3)通过本地套接字(localsocket),将序列化之后的数据从主解释器所在的进程,发送到子解释器所在的进程。
4)接下来,在子进程中,用 pickle对二进制数据进行反序列化操作,将其还原为 python对象。
5)引人包含 gcd函数的那个 python模块。
6)各条子进程平行地针对各自的输人数据,来运行 gcd函数。
7)对运行结果进行序列化操作,将其转变为字节。
8)将这些字节通过 socket复制到主进程之中。
9)主进程对这些字节执行反序列化操作,将其还原为 Python对象。
10)最后,把每条子进程所求出的计算结果合并到一份列表之中,并返回给调用者。

从编程者的角度看,上面这些步骤,似乎是比较简单的,但实际上,为了实现平行计算, multiprocessing模块和 ProcessPoolExecutor类在幕后做了大量的工作。如果改用其他编程语言来写,那么开发者只需用一把同步锁或一项原子操作,就可以把线程之间的通信过程协调好,而在 python语言中,我们却必须使用开销较高的 multiprocessing模块。 multipr戗 e妯 ng的开销之所以比较大,原因就在于:主进程和子进程之间,必须进行序列化和反序列化操作,而程序中的大量开销,正是山这些操作所引发的。

Effective Python:编写高质量 Python代码的59个有效方法

对于某些较为孤立,且数据利用率较高的任务来说.这套方案非常合适。所谓孤宣,是指待运行的数不需要与程序中的其他部分共享状态。所谓利用率高,是指只需要在主进程与子进程之间传递一小部分数据,就能完成人量的运算。本例中的最人公约数算法.满足这两个条件,其他一些类似的数学算法,也可以通过这套方案实现平行计算
如果待执行的运算不符合上述特征,那么 multiprocessing所产生的开销,可能使我们无法通过平行化(parallelization,并行化)来提升程序速度。在那种情况下,可以求勖山 iproce妯 ng所提供的一些高级机制,如共享内存(shared memory)、跨进程锁定(cross-processlock)、队列(queue)和代理(proxy)等。不过,那些特性用起来非常复杂。想通过那些 T具令多条 py山 on线程共享同一个进程的内存空间.本身已经相当困难,若还想经由 socket把它们套用到其他进程,则会使代码变得更加难懂。
笔者建议大家多使用简单的 concurrent.futures模块,并且尽量避开 multiprocessing里的那些复杂特性。对于较为孤立且数据利用率较高的函数来说,我们一开始可以试着用多线程的 Th跹 adPoo正` ecu类来运行。稍后,可以将其迁移到 Pro““ P00正№ cutor类,看看能不能提升程序的执行速度。如果试遍了各种方案,还是无法达到理想的执行速度.那我们再考虑直接使用 multiprocessing模块中的那些复杂特性

出自于:effctive python

猜你喜欢

转载自blog.csdn.net/budong282712018/article/details/80223184
今日推荐