python之互斥锁


1.互斥锁的概念

互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作。  【对共享数据进行锁定可以理解为全局变量】

注意:

  • 互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程需要等待,等互斥锁使用完释放后,其它等待的线程再去抢这个锁。

为了更好的理解互斥锁,请看下面的图:

【抢绣球】

3. 互斥锁的使用

threading模块中定义了Lock变量,这个变量本质上是一个函数,通过调用这个函数可以获取一把互斥锁。

互斥锁使用步骤:

# 创建锁
mutex = threading.Lock()# 上锁
mutex.acquire()...这里编写代码能保证同一时刻只能有一个线程去操作, 对共享数据进行锁定...# 释放锁
mutex.release()

注意点:

  • acquire和release方法之间的代码同一时刻只能有一个线程去操作
  • 如果在调用acquire方法的时候 其他线程已经使用了这个互斥锁,那么此时acquire方法会堵塞,直到这个互斥锁释放后才能再次上锁。

4. 使用互斥锁完成2个线程对同一个全局变量各加100万次的操作

import threading# 定义全局变量
g_num = 0# 创建全局互斥锁
lock = threading.Lock()# 循环一次给全局变量加1
def sum_num1():# 上锁lock.acquire()for i in range(1000000):global g_numg_num += 1print("sum1:", g_num)# 释放锁lock.release()# 循环一次给全局变量加1
def sum_num2():# 上锁lock.acquire()for i in range(1000000):global g_numg_num += 1print("sum2:", g_num)# 释放锁lock.release()if __name__ == '__main__':# 创建两个线程first_thread = threading.Thread(target=sum_num1)second_thread = threading.Thread(target=sum_num2)  # 因为无序,所以不知道先对哪个线程进行加锁# 启动线程first_thread.start()second_thread.start()# 提示:加上互斥锁,那个线程抢到这个锁我们决定不了,那线程抢到锁那个线程先执行,没有抢到的线程需要等待# 加上互斥锁多任务瞬间变成单任务,性能会下降,也就是说同一时刻只能有一个线程去执行

执行结果:

说明:

通过执行结果可以地址互斥锁能够保证多个线程访问共享数据不会出现数据错误问题

5. 小结

  • 互斥锁的作用就是保证同一时刻只能有一个线程去操作共享数据,保证共享数据不会出现错误问题
  • 使用互斥锁的好处确保某段关键代码只能由一个线程从头到尾完整地去执行
  • 使用互斥锁会影响代码的执行效率,多任务改成了单任务执行
  • 互斥锁如果没有使用好容易出现死锁的情况

python之互斥锁相关推荐

  1. Python 进程互斥锁 Lock - Python零基础入门教程

    目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进 ...

  2. Python 线程互斥锁 Lock - Python零基础入门教程

    目录 一.前言 二.Python 线程共享全局变量 三.Python 线程互斥锁 1.创建互斥锁 2.锁定资源/解锁资源 四.Python 线程死锁 五.重点总结 六.猜你喜欢 一.前言 在前一篇文章 ...

  3. Python | threading02 - 互斥锁解决多个线程之间随机调度,造成“线程不安全”的问题。

    文章目录 一.前言 二.线程不安全的现象 2.1.代码 2.2.运行 三.使用互斥锁解决线程不安全 3.1.代码 3.2.运行 四.忘记释放互斥锁,造成死锁 4.1.代码 4.2.运行 4.3.造成死 ...

  4. Python多线程--互斥锁、死锁

    1.互斥锁 为解决资源抢夺问题,使用mutex = Threading.Lock()创建锁,使用mutex.acquire()锁定,使用mutex.release()释放锁. 代码一: import ...

  5. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  6. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  7. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  8. python线程同步锁_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

  9. python同步锁和互斥锁的区别_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

最新文章

  1. Hinton 发表新作探索流体胶囊网络 | AI日报
  2. linux安装mysql5.7.18_Linux 安装MySQL5.7.18
  3. SharePoint 2010新体验2 – Ribbon界面
  4. Java Web开发技术详解~MIME类型
  5. 超牛!读博期间,他以第一作者发表7篇文章
  6. ps切图后 JAVA开发_2018年设计师都在用的PS切图插件--摹客
  7. SQL Server压缩日志及数据库文件大小
  8. 【项目管理一点通】(13) 如何写周报和日报
  9. loadrunner录制手机app脚本
  10. java 状态模式 同步_多人联机射击游戏中的设计模式应用(二):观察者模式,单例模式,状态模式,适配器模式...
  11. IT通过什么途径去美国工作?
  12. epiphone真伪
  13. cocos creator android 真机调试配置密匙
  14. 请给我一篇关于父母育儿方面书籍推荐的文案
  15. MMA-Mathematica定义函数
  16. 谷歌白帽SEO技术让你的搜索流量暴涨
  17. 【漫画】互联网人叹气图鉴
  18. 魔兽怀旧服服务器怎么修改,《魔兽世界怀旧服》转服功能怎么用 转服功能使用方法教程...
  19. 小四轴实验:空心杯电机驱动
  20. java和js中遍历数组和对象的总结

热门文章

  1. 让线上学习不打折扣,作业帮如何用技术促进课堂高频互动场?
  2. 涨见识了,在终端执行 Python 代码的 6 种方式
  3. 干货 | 时间序列预测类问题下的建模方案探索实践
  4. GraphSAGE:我寻思GCN也没我厉害!
  5. Python模拟微博登陆,亲测有效!
  6. 奇点汽车打算明年推L3自动驾驶,不用激光雷达
  7. 吊打 ThreadLocal!
  8. 一次性搞定权限树遍历(通用解决方案)
  9. 兄弟!kafka的重试机制,你可能用错了~
  10. 2021年2月程序员工资统计,又拖后腿了……