多进程
由于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内核。