Python多线程如何使用互斥锁
1、打开Ubuntu虚拟机,登录系统后,在桌面空白处右键 -- 打开终端。
2、在终端使用vi编辑器创建一个文件tetr.py,在文件写内容如下:from threading import Threadimport timenum = 0def test1(): global num for i in range(1000000): num += 1 print("---test1---num=%d"%num)def test2(): global num for i in range(1000000): num += 1 print("---test2---num=%d"%num)p1 = Thread(target=test1)p1.start()time.sleep(4)p2 = Thread(target=test2)p2.start()print("---num=%d---"%num)代码中创建了一个全局变量num,在两个线程中分别对num累加了100000次1,在第一个线程创建创建,延迟了4秒创建第二个线程。
3、在终端运行代码:python3 tetr.py结果如下下图所示,第一个线程执行完累加后全局变量变为100000,第二个线程执行完累加后全局变量变为200000和预期一致。
4、修改第二步代码,去掉第一个线程之后的sleep,代码如下:from threading import Threadimport timenum = 0def test1(): global num for i in range(1000000): num += 1 print("---test1---num=%d"%num)def test2(): global num for i in range(1000000): num += 1 print("---test2---num=%d"%num)p1 = Thread(target=test1)p1.start()p2 = Thread(target=test2)p2.start()print("---num=%d---"%num)
5、在终端运行代码,如下图所示python3 tetr.py发现并没有全局变量累加后并没有达到预期的200000,这是因为多线程导致的混乱。
6、为解决多线程使用全局变量的问题,引入互斥锁,修改代码如下:from threading import Thread,Lockimport timenum = 0颊俄岿髭def test1(): global num mutex.acquire() for i in range(1000000): num += 1 mutex.release() print("---test1---num=%d"%num)def test2(): global num mutex.acquire() for i in range(1000000): num += 1 mutex.release() print("---test2---num=%d"%num)mutex = Lock()p1 = Thread(target=test1)p1.start()p2 = Thread(target=test2)p2.start()print("---num=%d---"%num)简单来说互斥锁,就是先要引入Lock,然后在主线程实例化锁对象,最后在子线程操作全局变量时候上锁,操作完成后解锁。
7、在终端运行代码,可以成功看到预期的结果了,互斥锁使用效果很好。