python多进程,多线程之锁机制

锁添加的原因:

在多进程/多线程同时进入临界资源区获取和操作共有资源时,会出现资源的争夺而出现混乱。为了避免这种混乱现象,python提出了锁机制

线程锁/进程锁的定义和运用:

创建锁对象:

lock = Lock()

锁对象一旦创建,就可以随时被进程或者线程调用,并且一次创建锁只有一把,如果多个资源想同时获取锁,必须‘排队’,等上一个进程/线程释放了锁才可以请求获取锁

上锁(也叫请求锁)

lock.acquire()

acquire()是一个阻塞函数。一旦请求获取锁成功,就会把下面将要执行的程序的变量内存空间‘锁住’;而获取不成功则会一直阻塞在那里,等待上一个获得锁的进程/线程释放锁。

解锁

lock.release()

死锁:

死锁的出现有两种情况

1) 当一个进程或者一个线程一直调用或者占用同一锁Lock而不释放资源而导致其他进程/线程无法获得锁,就会出现的死锁状况,一直阻塞在aquire()处

2) 当有两个进程同时想获取两个锁的时候(再往上推就是多个进程想获取多个锁),由于两者都是出于竞争关系,谁也不让谁,谁快谁得手,但计算机中这种竞争关系是很微妙的,时间的差异性很小,于是,就出现了两者都阻塞在同一个地方,都无法同时获得两个锁或者获取对方已经获取的但还没有释放的锁。

为了解决死锁的问题,于是python提出了可重入锁的机制(RLock)

重入锁定义后,一个进程就可以重复调用指定次数的一个重入锁,而不用去跟别的进程一起争夺其他锁。

重入锁中内部管理者两个对象,即Lock对象和锁的调用次数count

下面说说RLock到底是怎么用的

1)RLock的定义

mutexA = mutexB = RLock( )

mutex值可以是多个的,定义了多少个,RLock内部的count就为几

2)RLock的请求

mutexA.acquire()

mutexA.acquire()

每申请一次锁,count就减1,两次请求过后,count从2减为0

因为上面定义的重入锁的内部个数为2,所以该重入锁可以被一个进程调用两次,并且在虽然它内部有多个锁,但只能由一个进程/线程调用,其他进程/线程不能干预,只有当这个进程/线程释放掉所有的重入锁,count=2时才可以被其他进程/线程调用。

3)RLock锁的释放

mutexA.release()

mutexB.release()

举例:

from multiprocessing import RLock,Process
from time import ctime,sleepmuxteA = mutexB =RLock()def fn1():muxteA.acquire()sleep(1)print(ctime(),'进程1获取A锁')mutexB.acquire()sleep(2)print(ctime(),'进程1获取B锁')muxteA.release()print('进程1释放A锁')mutexB.release()print('进程1释放B锁')def fn2():muxteA.acquire()sleep(1)print(ctime(),'进程2获取A锁')mutexB.acquire()sleep(1)print(ctime(),'进程2获取B锁')muxteA.release()print('进程2释放A锁')mutexB.release()print('进程2释放B锁')p1 = Process(target=fn1)
p2 = Process(target=fn2)
p1.start()
p2.start()p1.join()
p2.join()

结果如下:

那么如果我让进程2先开启呢?

结果如下:

显然,锁的获得是谁快谁得手,同时也验证了我上面描述的,一个进程对一个可重入锁的请求是排他型的,一旦这个进程请求了一个可重入锁,那么其他进程就无法再请求了,直到这个进程释放了可重入锁内部的所有锁。

python原语--锁Lock相关推荐

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

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

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

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

  3. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  4. python 线程锁 共享全局变量 线程通信

    python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...

  5. 同步锁Lock的使用

    2019独角兽企业重金招聘Python工程师标准>>> //数据同步锁保证数据的同步操作  private static Lock lock=new ReentrantLock(); ...

  6. php 线程锁,如何使用python线程锁(实例解析)

    在这篇文章之中我们来了解一下什么是python线程锁.了解一下python线程锁的相关知识,以及线程锁在python编程之中能起到什么样的作用. 线程锁(互斥锁Mutex) 一个进程下可以启动多个线程 ...

  7. 开线程插数据_python笔记7-多线程之线程同步(锁lock)

    前言丨 关于吃火锅的场景,小伙伴并不陌生,前面几章笔记里面我都有提到,今天我们吃火锅的场景: 吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼 ...

  8. python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解

    GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念. 1. GIL产生的背景: 在CPytho ...

  9. Python GIL 锁 - Python零基础入门教程

    目录 一.并行和并发 二.GIL 锁 案例一:单核多线程 案例二:单核多线程 案例三:双核多线程 三.如何解决 GIL 锁问题 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习 ...

最新文章

  1. AI科技大本营在线公开课大放送(附演讲PPT)
  2. GDCM:gdcm::Base64的测试程序
  3. Java中的面向接口编程
  4. 自动添加html结束标志,HTML:包含或排除可选的结束标记?
  5. oracle 备份导出,oracle 怎么备份或导入导出表
  6. 新手学完Java可以面试哪些岗位?
  7. 三国树状信息展示 winform
  8. oracle存储一个数字格式,Oracle根本数据类型存储格式研究(二)—数字类型
  9. 恒强制版系统980_恒强制版软件操作答疑
  10. 极限编程缺点_极限编程(XP)的优缺点是什么?
  11. XXX单板类热仿真分析
  12. 2022哈尔滨工程大学软件工程上岸经验贴
  13. 对话清华大学周昊,详解IJCAI杰出论文及其背后的故事
  14. PHP 实现爱查快递接口
  15. 18.8.17 考试总结
  16. window java 一键启动部署 mysql,jar
  17. 【转】P2P-BT对端管理协议
  18. Pointnet语义分割任务S3DIS数据集上的注意点
  19. Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must
  20. 【QGIS入门实战精品教程】4.8:QGIS如何下载SRTM数字高程模型DEM?

热门文章

  1. SICP2——Python中使用函数构建对象
  2. Nuxt - 项目打包部署及上线到服务器流程(SSR 服务端渲染)
  3. 全民都在信奉强权、关系,因为没有公正!
  4. Java 经典面试题和答案(下)
  5. 成享汇:互联网资深赚客为您分享如何找到合适自己的道路
  6. 易语言调用大漠插件后台绑定游戏窗口源码
  7. 计算机经典图书介绍 [转]
  8. CAD如何绘制叶轮?
  9. 深入浅出MyBatis:MyBatis的所有配置
  10. Agile Activities(敏捷活动)