1、为什么产生了GIL锁?

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

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

2、如何解决GIL?

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

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

# 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扩展编程技术

#include "Python.h"
...

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

__END__