CPython是特指C语言实现的Python(还有java写的python)
https://wiki.python.org/moin/PythonImplementations?action=show&redirect=implementation
GIL:全局解释器锁(cpython中)
GIL产生的背景,由于C语言底层原因,CPpython中多线程运行,每个线程都需要申请全局资源,但是Cpython并不能应对所有线程同时的资源请求,为防止发生错误,对所有线程申请全局资源的时候增加了限制--全局解释器锁。(造成线程只能一个一个的运行)
通过使用GIL这样简单的锁机制可以非常方便去实现多线程情况下保护同一个对象,防止它被多个线程同时去修改。缺陷就是没有办法去同时利用CPU的多核,只有一个线程去执行字节码。对CPU密集的任务影响会比较大。
GIL释放:当前线程执行超时(Python计时器)会自动释放,如果当前线程没有超时但执行结束也会释放,当前线程执行阻塞操作时也会自动释放(如IO操作,等待操作,下载操作)
python GIL全局解释器锁详解(吉多创建的时候只考虑到单核cpu)
解决多线程
1、Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu。
2、解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁。
3、cpython解析只允许拥有GIL全局解析器锁才能运行程序。
4、保证同一个时刻只允许一个线程可以使用cpu。
5、以前写cpython解析器的时候就考虑一个cpu情况。
6、由于大量的程序开发者接收了这套机制,现在代码量越来越多,已经不容易通过c代码去解决这个问题。
对所有面向I/O的(会调用内建的操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。如果某线程并未使用很多I/O操作,它会在自己的时间片内一直占用处理器和GIL。也就是说,I/O密集型的Python程序比计算密集型的Python程序更能充分利用多线程的好处。
仅仅是解释器的问题
计算密集型 进程
I/O密集型 读写相当慢 有等待 线程 协程