在多线程 时同一时刻只容许一个线程来访问CPU,直到解释器遇到I/O操做或者操做次数达到必定数目时才会释放GIL
参考 Python虽然不能利用多线程实现多核任务,但能够经过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。 启动与CPU核心数量相同的N个线程,在4核CPU上能够监控到CPU占用率仅有102%,也就是仅使用了一核。html
可是用C、C++或Java来改写相同的死循环,直接能够把所有核心跑满,4核就跑到400%,8核就跑到800%,为何Python不行呢?python
由于Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先得到GIL锁,而后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把全部线程的执行代码都给上了锁,因此,多线程在Python中只能交替执行,即便100个线程跑在100核CPU上,也只能用到1个核。多线程
GIL是Python解释器设计的历史遗留问题,一般咱们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。并发
线程之间共享内存的两种处理方法:spa
参考: http://www.cnblogs.com/iiiiiher/p/8341091.html 参考 个人机器有4核,表明着同一时间,能够干4个任务。若是单核cpu的话,我启动10个线程,我看上去也是并发的,由于是执行了上下文的切换,让我看上去是并发的。可是单核永远确定时串行的,它确定是串行的,cpu真正执行的时候,由于一会执行1,一会执行2.。。。。正常的线程就是这个样子的。可是,在python中,不管你有多少核,永远都是假象。不管你是4核,8核,仍是16核.......很差意思,同一时间执行的线程只有一个(线程),它就是这个样子的。这个是python的一个开发时候,设计的一个缺陷,因此说python中的线程是假线程。线程
参考设计
咱们知道多进程(mutilprocess) 和 多线程(threading)的目的是用来被多颗CPU进行访问, 提升程序的执行效率。 可是在python内部存在一种机制(GIL),在多线程 时同一时刻只容许一个线程来访问CPU。 GIL 并非Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就比如C++是一套语言(语法)标准,可是能够用不一样的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。 Python也同样,一样一段代码能够经过CPython,PyPy,Psyco等不一样的Python执行环境来执行。像其中的JPython就没有GIL。然而由于CPython是大部分环境下默认的Python执行环境。因此在不少人的概念里CPython就是Python,也就想固然的把 GIL 归结为Python语言的缺陷。因此这里要先明确一点:GIL并非Python的特性,Python彻底能够不依赖于GIL。 code
虽然python支持多线程,可是因为GIL的限制,在实际运行时,程序运行后开启多个线程,但在经过GIL后同时也只能有一个线程被CPU执行。htm
参考: http://www.cnblogs.com/zephyr-1/p/6043785.html GIL并非Python的特性,他是CPython引入的概念,是一个全局排他锁。blog
解释执行python代码时,会限制线程对共享资源的访问,直到解释器遇到I/O操做或者操做次数达到必定数目时才会释放GIL。
因此,虽然CPython的线程库直接封装了系统的原生线程,但CPython总体做为一个进程,同一时间只会有一个得到GIL的线程在跑,其余线程则处于等待状态。这就形成了即便在多核CPU中,多线程也只是作着分时切换而已,因此多线程比较适合IO密集型,不太适合CPU密集型的任务。 同一时刻一个解释进程只有一行bytecode 在执行