千家信息网

python多线程中互斥锁与死锁的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、多线程间的资源竞争以下列task1(),task2()两个函数为例,分别
千家信息网最后更新 2026年11月02日python多线程中互斥锁与死锁的示例分析

小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、多线程间的资源竞争

以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(数据大一些,太小的话执行太快,达不到验证的效果)。

import threadingimport timenum = 0def task1(nums):    global num    for i in range(nums):        num += 1    print("task1---num=%d" % num)def task2(nums):    global num    for i in range(nums):        num += 1    print("task2---num=%d" % num)if __name__ == '__main__':    nums = 10000000    t1 = threading.Thread(target=task1, args=(nums,))    t2 = threading.Thread(target=task2, args=(nums,))    t1.start()    t2.start()    # 因为主线程不会等子线程执行完就会执行,所以这里延迟五秒,确保最后执行。    time.sleep(5)    print("main----num=%d" % num)

程序运行结果:

如图,输出结果比较混乱,既没有一千万,最终结果也不是二千万。因为多线程运行时出现了资源竞争,即可以理解为,每个函数运行的时间都不确定,且互相影响,
如从初始值0开始,假设t1的线程先执行,执行到+1后,此时的num=1还未存储,然后即被叫停,t2开始执行,去获取num,获取到的num等于初始值0,然后其执行了+1并存储,存储后num=1,然后t2停止t1继续,再次存储num=1。即加了两次1,但是num还是只等于1。
因为t1和t2谁来运行的分配是完全随机的,所以最后加了两千万次1后值是小于2000万的。

解决此类问题,可以使用到互斥锁 。

二、互斥锁

  • 某个线程要更改共享数据时,先将其锁定,此时资源的状态为"锁定",其他线程不能改变,只到该线程释放资源,将资源的状态变成"非锁定",其他的线程才能再次锁定该资源。

  • 互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

1.互斥锁示例

创建一把锁:

mutex = threading.Lock()
mutex.acquire() # 上锁xxxx锁定的内容xxxxxmutex.release() # 解锁

将互斥锁加入到上边的代码中如下,则问题得到了解决。

import threadingimport timenum = 0def task1(nums):    global num    mutex.acquire()    for i in range(nums):        num += 1    mutex.release()    print("task1---num=%d" % num)def task2(nums):    global num    mutex.acquire()    for i in range(nums):        num += 1    mutex.release()    print("task2---num=%d" % num)if __name__ == '__main__':    nums = 10000000    mutex = threading.Lock()    t1 = threading.Thread(target=task1, args=(nums,))    t2 = threading.Thread(target=task2, args=(nums,))    t1.start()    t2.start()    # 因为主线程不会等子线程执行完就会执行,所以这里延迟五秒,确保最后执行。    time.sleep(5)    print("main----num=%d" % num)

程序运行结果:

2.可重入锁与不可重入锁

threading.Lock()上的是不可重入锁,即一次只能加一把锁,不能加多把。

threading.Lock()

如果需要同时加多把所,则需加入不可重入锁

创建一把可重入锁:

mutex = threading.RLock()mutex.acquire() # 上锁mutex.acquire() # 再上锁xxxx锁定的内容xxxxxmutex.release() # 解锁mutex.release() # 再解锁

其中上锁和解锁的次数必须保持一致。

三、死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会程序堵塞,造成死锁。

  • 死锁一般用不到。

  • 程序设计要尽量避免。

看完了这篇文章,相信你对"python多线程中互斥锁与死锁的示例分析"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

线程 资源 死锁 运行 程序 结果 存储 示例 数据 分析 两个 内容 再次 函数 同时 状态 篇文章 问题 加多 保证 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技产业 互联网科技垄断 互联网最新的科技有限公司 互联网与科技金融数据 北京互联网科技有限公司 猪兼强互联网科技 成都互联网科技公司 深圳齐家互联网科技 壕鑫互联网络科技 伴你行互联网科技有限公司 郑州华宇互联网科技 互联网科技公司有哪些 互联网科技类展会 小米互联网科技园设置 上海创道互联网络科技有限公司 互联网风格科技公司名称 广州梦谷互联网科技有限公司领导 普陀区互联网教育科技管理办法 互联网科技创新创业项目 陕西彩京云互联网科技有限公司 上海挚品互联网科技有限公司 深圳科技互联网 亿策互联网科技 润盈互联网科技 中国最先进互联网科技公司 湖北码尼互联网科技有限公司电话 乌苏新华互联网科技做什么的 广州新华互联网科技学校电竞方面 深圳艾果互联网通讯科技 杭州科技互联网公司有哪些
0