一、全局解释器锁(GIL)
1.python在设计之初就考虑到要在主循环中,同时西游一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序再CPU中运行。同样地,虽然python解释器中可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行
2.对python虚拟机的访问由全局解释器锁(GIL)来控制,正式这个锁能保证同一时刻只有一个线程在运行、
3.线程锁是为了保证共享数据的一致性,如果不加锁,会造成数据的不一致,加了锁,保证在同一时间里,只能运行一个线程修改共享数据,其他线程阻塞等待该线程的结束
注意:结束后一定要释放锁,不然会一直阻塞下去
二、面向对象线程
1.未上锁
(1)代码
import threading
import time
class MyThread(threading.Thread):
num = 0
def run(self):
global num
time.sleep(1)
num += 1
msg = self.name + "---"+ str(num)
print(msg)
num = 0
def run_test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
run_test()
(2)结果
2.上锁
(1)代码
import threading
import time
num = 0
lock = threading.Lock() # 设置锁
class MyThread(threading.Thread):
def run(self):
lock.acquire()
# 声明全局
global num
time.sleep(1)
num += 1
msg = self.name + "---"+ str(num)
print(msg)
lock.release() # 解锁
def run_test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
run_test()
(2)结果