Python基础-线程锁

一、全局解释器锁(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)结果

猜你喜欢

转载自blog.csdn.net/qq_39620483/article/details/87859068