40.多进程同步--锁--多把锁
多进程同步
- 首先多进程默认是并发行为,多个进程同时执行
- 执行的顺序,以及何时执行完毕无法控制
- 多个进程如果涉及到了通信,数据的有序性无法保证
- 需要锁来控制进程之间执行的顺序
- 对于进程资源的控制
- 缺点:同步进程,并发没有了。效率低下。
- Lock:一把锁
- Lock.acquire() 拿着锁 通信证
- 抢占锁,如果拿不到,阻塞等待
- Lock.release() 放掉锁
- 一定要记得在工作完毕之后释放锁。
- **Semaphore**:多把锁,同时提供多把锁/通行证,保证可以有一定个数的进程保持并发,这个用的多一点
- s = Semaphore(3)
- s.acquire()
- s.release()
- 一般情况下我们多进程操作数据库的时候必须加锁,这样才能保证数据的有序性
#多进程同步/锁 from multiprocessing import Process,current_process,Lock import sys from time import sleep def work(l):print('%s进程已经开始了' % current_process().name)l.acquire() #抢占这个通信证/锁for var in range(65,68):print('%s:%s' % (current_process().name,chr(var)))sys.stdout.flush()l.release() #放掉通行证 def main():l = Lock()Process(target=work,name='a',args=(l,)).start()Process(target=work,name='b',args=(l,)).start()Process(target=work,name='c',args=(l,)).start() if __name__ == "__main__":main()
运行结果:
a进程已经开始了 y a:A a:B a:C b进程已经开始了 b:A b:B b:C c进程已经开始了 c:A c:B c:C
#多进程同步/多把锁(信号量) from multiprocessing import Process,current_process,Semaphore import sys from time import sleep def work(s):print('%s进程已经开始了' % current_process().name)s.acquire()for var in range(65,100):print('%s:%s' % (current_process().name,chr(var)))sys.stdout.flush()s.release() def main():s = Semaphore(3) #通行证,限制同一时间提供了3把锁,也就是说同一时间最多3个进程同时工作,其余的进程阻塞等待,Process(target=work,name='a',args=(s,)).start()Process(target=work,name='b',args=(s,)).start()Process(target=work,name='c',args=(s,)).start()Process(target=work,name='d',args=(s,)).start()Process(target=work,name='e',args=(s,)).start() if __name__ == "__main__":main()
转载于:https://www.cnblogs.com/zhangan/p/10262456.html
40.多进程同步--锁--多把锁相关推荐
- java并发,同步synchronize和lock锁的使用方法和注意,死锁案例分析
1.什么是线程安全问题 多个线程同时共享同一个全局变量或者静态变量的时候,某个线程的写操作,可能会影响到其他线程操作这个变量.所有线程读一个变量不会产生线程安全问题. 实际场景就是火车站买票问题:剩余 ...
- 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...
本文主要讲多线程的线程之间的资源共享怎么保持同步. 多线程基础篇见,木头人:Python threading实现多线程 基础篇 Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如 ...
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- 线程同步锁 java_java多线程同步之重入锁,详细解析
上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...
- java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)
本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...
- java 同步锁_java线程中的同步锁和互斥锁有什么区别?
在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别.概念上的区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执 ...
- java锁方法和锁代码块_java的同步方法和同步代码块,对象锁,类锁区别
/** * @author admin * @date 2018/1/12 9:48 * 做用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...
- java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?
先综述个结论:一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能.一般说synchro ...
- java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...
前言 为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantRead ...
最新文章
- Spring Boot与Redis的集成
- java 无视报错编译_java 无视报错编译
- linux vi修改后如何保存
- qrcode.js 二维码生成器
- mybatis学习(47):嵌套查询--一对一
- ubuntu下面的git服务器搭建
- 量子计算机九章能否预测未来,张礼立 : 中国 “九章”量子计算机到底厉害在哪?...
- 进程函数一步步理解Linux进程(2)--进程编程进程函数
- 老年人学摄影,装备该如何选择?
- c语言追加字符串_Redis源码解析二--简单动态字符串
- python和c 的区别-c 跟 python的区别有哪些
- 问题六十八: 着色模型(shading model)(0)——《Ray Tracing from the Ground Up》代码的移植
- 早上内部资源共享讨论发言稿
- org.springframework.web.context.ContextLoaderListener 解决方案
- 使用PhoneNumberValidator判断用户输入的电话格式,并用PhoneFormatter对电话号码格式化。...
- 基于Windows Server 2008 R2的Failover Cluster(故障转移群集)部署Sql Server 2008 AA(主主) 模式群集(第一部分)
- 腾讯元老辞职后,回到老家每天对着200亩地发呆
- 1.5.12、面向对象下__接口Implement,接口的使用
- 不知道如何写好作文?写好作文的十大技巧赶紧收好
- mysql dump 2013_mysqldump 错误2013 Lost connection
热门文章
- 关于SpringMVC和Struts2的区别
- UVa 11174 - Stand in a Line
- ActiveRecordBase借助NHibernate的条件获取实体类对象
- ORB_SLAM2 PnPSolver
- html5类选择器选择权重,Python Html5和CSS3的新增功能:CSS权重与CSS3新增选择器
- c语言大项目经验,C语言该学的地方(项目经验)
- c语言使能,什么是锁存使能输入
- android sdk软件开发套件,ANDROIDSDK-SITARA
- linux文件每行长度,linux – 根据第一列/行中的字符长度对文件进行排序
- 我叫Java,2019年总结,大家请查收