1.同步锁(互斥锁)   from  mutilprocessing  import Lock   方式一:   lock=Lock()   lock.acquire()   数据操作的代码   lock.release()   方式二:   with lock:        数据操作代码2.信号量    from  mutilprocessing  import Semaphore    一把锁,多把钥匙    s=semaphore(n)  #同一时间只有n个进程进入锁里的代码    s.acquire()    数据操作代码    s.release()

3.事件    from mutilprocessing import Event    e=Event() #默认    e.set()    e.clear()    e.wait()    e.is_set()4.    队列 Queue  进程间通信 保证数据安全(同一个数据只有一个进程能拿到)        先进先出        q=Queue()        q.put()        q.get()        q.full()        q.empty()        q.get_nowait()        q.put_nowait()

    Jionablequeue  和队列类似 多了两个方法 join() task_done()

    守护进程  daemon

        随着父进程结束,守护进程跟着结束        p.daemon=True #必须在p.start 前加        如何将一个子进程设置为守护进程,不能在该子进程中再开子进程

生产者和消费者模型:通过一个第三方(类似缓冲区)进行解耦

from multiprocessing import Process,Lock
import timedef show_ticket(i):with open("file","r",encoding="utf-8") as f:num=f.read().strip()print("%s客户查看到了剩余票数:"%i,num)def func1(i,lock):show_ticket(i)print("准备开始抢票了")time.sleep(1)lock.acquire()with open("file","r",encoding="utf-") as f:num=f.read().strip()if num=="0":print("没票了")else:with open("file","w",encoding="utf-8") as f:num=int(num)num-=1f.write(str(num))print("%s客户抢到票了"%i)lock.release()if __name__ == '__main__':lock=Lock()for i in range(10):p=Process(target=func1,args=(i,lock))p.start()

锁LOCK

from multiprocessing import Event,Processe=Event()#两个状态  true false   默认为false
print("开始了")print(e.is_set()) #查看事件当前的状态  #False

e.set() #将当前事件状态改为trueprint(e.is_set())#true

e.clear() #将当前事件改为flase

e.wait()  #事件等待
print(e.is_set())

事件1

from multiprocessing import Process,Event
import time
def func1(e):time.sleep(2)print("子进程一大堆运算")e.set()  #将事件改为trueif __name__ == '__main__':e=Event()p=Process(target=func1,args=(e,))p.start()print("主进程开始程序")time.sleep(1)print("等待子进程通知")e.wait()print("拿到子进程通知,继续执行")

事件2Event

from multiprocessing import Process,Semaphore
import timedef func1(i,s):s.acquire()time.sleep(1)print("%s男嘉宾大保健开始"%i)time.sleep(0.5)print("%s大保健结束"%i)s.release()if __name__ == '__main__':s=Semaphore(3) #信号量和lock类似,多了参数for i in range(10):p=Process(target=func1,args=(i,s))p.start()

信号量semaphore

from multiprocessing import Process,Queuedef func(q):ret=q.get()print(ret)if __name__ == '__main__':q=Queue(5)   #队列是进程安全的q.put("hello gril")p=Process(target=func,args=(q,))p.start()print("主进程结束")def func(q):ret=q.get()print(ret)if __name__ == '__main__':q=Queue(3)q.put("约吗")p=Process(target=func,args=(q,))p.start()print("主进程结束")

基于队列进程通信Queue

from multiprocessing import Process
import os
import time
class Myprocess(Process):def __init__(self,person):super().__init__()self.person=persondef run(self):print(os.getpid(),self.name)print("%s正在和女主播聊天"%self.person)if __name__ == '__main__':p=Myprocess("刘德华")p.daemon=True  #一定要在p.start()之前设置p守护进程,禁止p创建子进程,并且父进程代码执行完毕,p将终止运行
    p.start()time.sleep(1)print("主进程结束")

守护进程daemon

from multiprocessing import Process,Queue
import timedef producer(q):for i in range(10):time.sleep(1)q.put("包子%s号"%i)print("包子%s号生产完毕"%i)q.put(None)def consumer(q):while 1:baozi=q.get()if baozi==None:breaktime.sleep(1.5)print("%s被吃完"%baozi)if __name__ == '__main__':q=Queue(10)p1=Process(target=producer,args=(q,))p2=Process(target=consumer,args=(q,))p1.start()p2.start()

生产者消费者模型

from multiprocessing import Process,JoinableQueueimport time,random,osdef producer(food,q):for i in range(10):time.sleep(random.random())ret="%s%s"%(food,i)q.put(ret)print("%s生产了%s"%(os.getpid(),ret))print("%s生产结束"%food)q.join() #生产完毕,使用此方法进行阻塞 ,直到队列中所有项目均被处理# print("%s生产结束" % food)def consumer(q):while 1:ret=q.get()time.sleep(random.random())print("%s吃了%s"%(os.getpid(),ret))q.task_done()#向q.join()发送一次信号,证明一个数据被取走if __name__ == '__main__':q=JoinableQueue()#生产者们p1=Process(target=producer,args=("包子",q,))p2=Process(target=producer,args=("玉米",q,))p3=Process(target=producer,args=("鱼",q,))#消费者们c1=Process(target=consumer,args=(q,))c2=Process(target=consumer,args=(q,))c1.daemon=Truec2.daemon=True#开始p_1=[p1,p2,p3,c1,c2]for p in p_1:p.start()p1.join()p2.join()p3.join()

JoinableQueue生产者消费者模型

转载于:https://www.cnblogs.com/knighterrant/p/10038839.html

31 锁,信号量,事件,队列相关推荐

  1. day034 锁,信号量,事件,队列,子进程与子进程通信,生产者消费者模型,joinableQueue...

    进程锁 #加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全. 虽然可以用文件共享数据实现进程间通信,但问题是: 1 ...

  2. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)...

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  3. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))...

    昨日内容回顾 python中启动子进程 并发编程 并发 :多段程序看起来是同时运行的 ftp 网盘 不支持并发 socketserver 多进程 并发 异步 两个进程 分别做不同的事情 创建新进程 j ...

  4. C++多线程 互斥锁 信号量 事件 临界区

    一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...

  5. Python之进程+线程+协程(同步对象、信号量、队列)

    文章目录 Event同步对象 semaphore信号量 队列 本篇是关于Python进程方面的内容了,主要是Event同步对象,信号量和队列 Event同步对象 1.概念: 我们可以对一个线程set一 ...

  6. 进程锁、事件、进程队列、进程间共享数据、生产者消费者模型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 进程锁(Lock) 锁的基本概念 锁的基本用法 模拟12306抢票软件 信号量:Semaphone 概念 Semaphore ...

  7. GIL+死锁与递归锁+信号量+event事件

    GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线 ...

  8. 并发编程:并发和并行、多进程、同步异步,阻塞非阻塞、进程同步(进程锁)、线程、GIL全局解释器锁、锁-信号量-Event事件、协程

    文章目录 一. 操作系统的发展史 二. 进程基础 三. 并发和并行 四. 如何开启多进程 五. 进程调度算法(了解) 六. 同步异步,阻塞非阻塞(了解) 1. 状态介绍 2.同步和异步.阻塞和非阻塞 ...

  9. 网络编程7_ multiprocessing类-管道.数据共享, 信号量,事件,进程池

    一. multiprocessing类     6. 管道     进程间通信(ipc)方式二: 管道会导致数据不安全的情况, 后面我们会说到为什么会带来数据不安全的问题     创建管道的类:    ...

最新文章

  1. 深度学习在锦囊细选上的应用
  2. 假设一个学校的计算机系新建,武汉大学计算机学院《计算机系统结构》08级A卷B卷及答案...
  3. Pytorch教程(十五):element-wise、Broadcasting
  4. 关于Keychain
  5. Android Build.VERSION.SDK_INT兼容介绍
  6. 信奥中的数学:二次互反律
  7. Java笔记-AES加解密(PKCS7padding可用)
  8. 断开式 DataGridView控件 winform
  9. 微博拟全球发售1100万股 发售价不超388港元
  10. 自动备份 SourceSafe
  11. 工作队列 ( workqueue )
  12. WCF实例上下文以及会话学习
  13. 计算机基础知识试题 试题及答案
  14. Pick定理、欧拉公式和圆的反演
  15. 如何变更 Git 服务器 IP 地址以及变更后的解决方法
  16. iOS开发之如何保证控件位置不变,增加触控范围(即frame和bounds的区别)
  17. python 实现使用163邮箱发送有图片的邮件
  18. Dharma勒索软件继续大肆传播,据称已有100多家希腊网站沦陷
  19. iphone与android共享位置,苹果手机,相互始终共享位置了以后,查看不了对方的位置...
  20. kuix教程1:我的第一Kuix应用

热门文章

  1. iOS开发 - Swift实现清除缓存功能
  2. UI1_UIView层操作
  3. 不是世界不好,而是你见得太少
  4. iOS tabview 适配问题
  5. SQL入侵恢复XP_CMDSHLL与开3389
  6. Oracle学习笔记:数据字典
  7. jQuery中this与$(this)的区别总结
  8. 响应式网页布局 - W3Schools How-Tos 01
  9. 阿里巴巴将赴NIPS 2017 3大事业部联袂展示AI全技能
  10. iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验