1、为什么产生了GIL锁?

在python设计的年代,都是单核CPU,因为进程程是CPU是分配资源的最小单位,所以不会有数据操作混乱的问题。
随计算机的发展,出现了多核CPU, pyhton为了利用多核的优势,开始支持多线程,解决多线程之间的数据完整性、状态同步就是加锁, 所以产生了GIL锁

GIL锁是python的全局解释性锁, 同一个进程中假设有多个线程运行, 其中一个线程会独占python解释器(GIL),使得其他线程无法运行,等该线程运行完成后其他线程才能运行
所以在多线程中,线程的执行仍然是有先后顺序的,并不是同时进行的(python的特点)

2、如何解决GIL?

GIL最大的问题就是python的多线程程序并不能利用多核的优势(比如一个使用了多个线程的计算密集型程序只会在一个单CPU上执行)

2.1 如果是完全的python环境,使用multiprocessing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Processing pool (see below for initiazation)
pool = None

# Performs a large calculation (CPU bound)
def some_work(args):
...
return result

# A thread that calls the above function
def some_thread():
while True:
...
r = pool.apply(some_work, (args))
...

# Initiaze the pool
if __name__ == '__main__':
import multiprocessing
pool = multiprocessing.Pool()

2. 另外一个方式,引入C扩展编程技术

1
2
3
4
5
6
7
8
9
10
11
#include "Python.h"
...

PyObject *pyfunc(PyObject *self, PyObject *args) {
...
Py_BEGIN_ALLOW_THREADS
// Threaded C code
...
Py_END_ALLOW_THREADS
...
}

__END__