多进程

由于python的GIL全局解释器锁存在, 多线程未必是cpu密集型程序的选择.多进程可以完全独立的进程环境中运行程序, 可以较充分第利用多处理器.但是进程本身的隔离带来的数据不共享也是一个问题.而且线程比进程轻量级.

multiprocessing

import multiprocessing
import datetime
def calc(i):
    sum  = 0
    for _ in range(1000000000):
        sum += 1
    return i, sum
if __name__ == '__main__':

    start = datetime.datetime.now()
    ps = []

    for i in range(4):
        p = multiprocessing.Process(target=calc, args = (i,), name = 'calc-{}'.format(i))
        ps.append(p)
        p.start()

    for p in ps:
        p.join()
        print(p.name, p.exitcode)

    delta = (datetime.datetime.now() - start).total_seconds()
    print(delta)

python concurrent.futures python因为其全局解释器锁GIL而无法通过线程实现真正的平行计算。这个论断我们不展开,但是有个概念我们要说明,IO密集型 vs. 计算密集型。

IO密集型:读取文件,读取网络套接字频繁。

计算密集型:大量消耗CPU的数学与逻辑运算,也就是我们这里说的平行计算。

而concurrent.futures模块,可以利用multiprocessing实现真正的平行计算。

核心原理是:concurrent.futures会以子进程的形式,平行的运行多个python解释器,从而令python程序可以利用多核CPU来提升执行速度。由于子进程与主解释器相分离,所以他们的全局解释器锁也是相互独立的。每个子进程都能够完整的使用一个CPU内核。

Copyright © hubhack 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-08-01 11:30:45

results matching ""

    No results matching ""