前言
Python在并行运算方面因为GIL(Global Interpreter Lock,全局解释器锁)而饱受诟病,认为Python的多线程其实是伪的,很鸡肋,这里就大致讲解下吧,
在Python的原始解释器CPython中存在着GIL,因此在解释执行Python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL
所以有GIL效果就是:** 一个进程内同一时间只能允许一个线程进行运算 ** (这尼玛不就是单线程吗?)
至于为什么要有GIL?只能说这是个历史遗留问题了,人家发明Python的时候压根就没想到现在居然有多核CPU,甚至多CPU的电脑啊~
再至于为什么GIL没有被优化掉,总是有人家的考虑的,反正Python3也继续了GIL的优良传统,爱用不用,有兴趣的自行搜索GIL吧
我这里尽量用事实说话,直接黑盒测试下常见的几种并行运算方式
正文
测试环境:
电脑:
我的电脑
Python: 2.7.10
我都是使用 multiprocessing 模块进行对比,对比三种常见的使用情况,我分别取名(非官方):ThreadPool,DummyPool,ProcessPool
引入方式如下:
from multiprocessing.pool import ThreadPool
from multiprocessing.dummy import Pool as DummyPool
from multiprocessing import Pool as ProcessPool
说明: ThreadPool,DummyPool 都是线程池,ProcessPool 是进程池
测试代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/1
from multiprocessing.pool import ThreadPool
from multiprocessing.dummy import Pool as DummyPool