GIL,线程,协程
并行与并发
并发:一个CUP运行多个程序,就好像一个人吃三个馒头。
并行:一个程序同一时刻运行在多个CUP上,就好像三个人吃一个馒头。
再从网上借用个例子:
“并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。
从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。明白了这个区别后再往下看。
GIL
由于新的项目可能需要进行py线程级别的操作,便开始学习了python线程的相关知识。但是学习的过程中发现,由于py中GIL(解释器全局锁)的存在,线程对于py来说似乎是一个比较鸡肋的东西。
关于GIL这篇文章解释的很好:http://www.oschina.net/translate/pythons-hardest-problem?p=2#comments
既然如此,为什么py中不取消GIL呢?这篇文章给予了一定程度的解答:http://www.cnblogs.com/mindsbook/archive/2009/10/15/thread-safety-and-GIL.html
有网友A评论说:由于 GIL 的存在,Python 的多线程永远只能利用一个 CPU 核心。也就是说,如果你的机器是四核的,那么有三个核心永远都是闲置的。Python 其实不太适合运用在需要多线程的环境。Python 根本就没有真正意义上的多线程。
网友B:多线程是为了解决并发而不是并行。虽然有GIL的存在,但是注意当IO阻塞时,GIL是会被释放的,所以对于IO较多的操作,多线程是有很大效率的提升的。
线程,协程
由上面可知,py中为了简单和安全考虑,并不打算在解释器中移出GIL,但是Jpython中已经取消了GIL。
如果某些原因还需要使用Python解释器呢?
我的看法和主流看法类似,可能的情况下使用多进程取代多线程。
进一步学习发现了协程这个东西,http://www.cnblogs.com/chgaowei/archive/2012/06/21/2557175.html 这篇文章介绍的不错。
利用yield可以在python中实现协程操作,也有gevent这样的框架支持。