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__