Python多线程如何使用互斥锁

2025-11-22 06:00:13

1、打开Ubuntu虚拟机,登录系统后,在桌面空白处右键 -- 打开终端。

Python多线程如何使用互斥锁

2、在终端使用vi编辑器创建一个文件tetr.py,在文件写内容如下:

from threading import Thread

import time

num = 0

def 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秒创建第二个线程。

Python多线程如何使用互斥锁

3、在终端运行代码:

python3 tetr.py

结果如下下图所示,第一个线程执行完累加后全局变量变为100000,第二个线程执行完累加后全局变量变为200000和预期一致。

Python多线程如何使用互斥锁

4、修改第二步代码,去掉第一个线程之后的sleep,代码如下:

from threading import Thread

import time

num = 0

def 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)

Python多线程如何使用互斥锁

5、在终端运行代码,如下图所示

python3 tetr.py

发现并没有全局变量累加后并没有达到预期的200000,这是因为多线程导致的混乱。

Python多线程如何使用互斥锁

6、为解决多线程使用全局变量的问题,引入互斥锁,修改代码如下:

from threading import Thread,Lock

import time

num = 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,然后在主线程实例化锁对象,最后在子线程操作全局变量时候上锁,操作完成后解锁。

Python多线程如何使用互斥锁

7、在终端运行代码,可以成功看到预期的结果了,互斥锁使用效果很好。

Python多线程如何使用互斥锁

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢