多进程同步


  • 首先多进程默认是并发行为,多个进程同时执行
  • 执行的顺序,以及何时执行完毕无法控制
    • 多个进程如果涉及到了通信,数据的有序性无法保证
    • 需要锁来控制进程之间执行的顺序
    • 对于进程资源的控制
  • 缺点:同步进程,并发没有了。效率低下。
  • 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.多进程同步--锁--多把锁相关推荐

  1. java并发,同步synchronize和lock锁的使用方法和注意,死锁案例分析

    1.什么是线程安全问题 多个线程同时共享同一个全局变量或者静态变量的时候,某个线程的写操作,可能会影响到其他线程操作这个变量.所有线程读一个变量不会产生线程安全问题. 实际场景就是火车站买票问题:剩余 ...

  2. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...

    本文主要讲多线程的线程之间的资源共享怎么保持同步. 多线程基础篇见,木头人:Python threading实现多线程 基础篇 Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如 ...

  3. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  4. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  5. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)

    本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...

  6. java 同步锁_java线程中的同步锁和互斥锁有什么区别?

    在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别.概念上的区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执 ...

  7. java锁方法和锁代码块_java的同步方法和同步代码块,对象锁,类锁区别

    /** * @author admin * @date 2018/1/12 9:48 * 做用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...

  8. java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?

    先综述个结论:一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能.一般说synchro ...

  9. java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

    前言 为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantRead ...

最新文章

  1. Spring Boot与Redis的集成
  2. java 无视报错编译_java 无视报错编译
  3. linux vi修改后如何保存
  4. qrcode.js 二维码生成器
  5. mybatis学习(47):嵌套查询--一对一
  6. ubuntu下面的git服务器搭建
  7. 量子计算机九章能否预测未来,张礼立 : 中国 “九章”量子计算机到底厉害在哪?...
  8. 进程函数一步步理解Linux进程(2)--进程编程进程函数
  9. 老年人学摄影,装备该如何选择?
  10. c语言追加字符串_Redis源码解析二--简单动态字符串
  11. python和c 的区别-c 跟 python的区别有哪些
  12. 问题六十八: 着色模型(shading model)(0)——《Ray Tracing from the Ground Up》代码的移植
  13. 早上内部资源共享讨论发言稿
  14. org.springframework.web.context.ContextLoaderListener 解决方案
  15. 使用PhoneNumberValidator判断用户输入的电话格式,并用PhoneFormatter对电话号码格式化。...
  16. 基于Windows Server 2008 R2的Failover Cluster(故障转移群集)部署Sql Server 2008 AA(主主) 模式群集(第一部分)
  17. 腾讯元老辞职后,回到老家每天对着200亩地发呆
  18. 1.5.12、面向对象下__接口Implement,接口的使用
  19. 不知道如何写好作文?写好作文的十大技巧赶紧收好
  20. mysql dump 2013_mysqldump 错误2013 Lost connection

热门文章

  1. 关于SpringMVC和Struts2的区别
  2. UVa 11174 - Stand in a Line
  3. ActiveRecordBase借助NHibernate的条件获取实体类对象
  4. ORB_SLAM2 PnPSolver
  5. html5类选择器选择权重,Python Html5和CSS3的新增功能:CSS权重与CSS3新增选择器
  6. c语言大项目经验,C语言该学的地方(项目经验)
  7. c语言使能,什么是锁存使能输入
  8. android sdk软件开发套件,ANDROIDSDK-SITARA
  9. linux文件每行长度,linux – 根据第一列/行中的字符长度对文件进行排序
  10. 我叫Java,2019年总结,大家请查收