Python GIL锁 互斥锁
GIL锁是什么
GIL(Global Interperter Lock)称为全局解释器锁,并不是python语言独有的,而是python的常用解释器cpython上存在的(jython即java写成的python解释器没有)
互斥锁是什么
python代码层面的对多线程中共享资源的加锁
GIL锁和互斥锁的异同点
-
相同:
都是为了解决解释器中多个线程资源竞争的问题 -
异:
互斥锁是运用在一个py文件中的,也就是在一个应用程序中,是python代码层面的锁。解决我们自己写的Python程序中多线程共享资源的问题。
GIL是Python解释器层面的锁,解决解释器中多个线程的竞争资源问题。
为什么有了GIL还要加互斥锁
https://blog.csdn.net/sinat_38682860/article/details/108056170?utm_source=app
因为只有GIL锁,仍然会出现线程数据的不安全性
# 线程资源不安全版(没加互斥锁)
from threading import Lock,Thread
n = 10000000
def func():
global n
for i in range(1000000):
n -= 1
t_lst = []
for i in range(10):
t = Thread(target=func)
t.start()
t_lst.append(t)
for i in t_lst:i.join()
print(n)
# 线程资源安全,加了互斥锁
from threading import Lock,Thread
n = 10000000
def func(lock):
global n
for i in range(1000000):
lock.acquire()
n = n - 1
lock.release()
t_lst = []
lock = Lock()
for i in range(10):
t = Thread(target=func,args=(lock,))
t.start()
t_lst.append(t)
# 调用一个 Thread 的 join() 方法,可以阻塞自身所在的线程。
for i in t_lst:i.join()
print(n)