1.进程间通信(IPC机制)

第一种:管道

  1. import subprocess
    res=subprocess.Popen('dir',shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)

第二种:队列=管道+锁

注:队列占用的是内存的大小,不应该放大数据,应该放一些简单的消息

  1. from multiprocessing import Queue
    q=Queue()
    q.put(['a'],block=True,timeout=3) block默认为True,队列满时锁住,如果三秒之后队列还是满的,会抛出异常
    q.put({'a':1},block=True,timeout=3)
    q.put('a',block=True,timeout=3)
    q.put_nowait(1)等同于q.put(1,block=False) 队列满时直接抛出异常,不会再等
    prite(q.get(block=True,timeout=3))从队列中取值,队列中没有值等3秒,之后还没值会抛出异常
    prite(q.get_nowait())从队列中取值,如果没有值,直接抛出异常
  2.  
  3. 2.生产者消费者模型
  1. 1. 什么是生产者消费者模型
    生产者:代指生产数据的任务
    消费者:代指处理数据的任务
    该模型的工作方式:
    生产生产数据传递消费者处理
  2.  
  3. 实现方式:
    生产者---->队列<------消费者
  4.  
  5. 2. 为何要用
    当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据
    就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率
  1. 3.如何用:
    第一种:
  1. from multiprocessing import Queue,Process
    import time,random
    def Producer(name,food,p):
    for i in range(1,3):
    res='%s%s'%(food,i)
    time.sleep(random.randint(1,3))
    p.put(res)
    print('厨师%s做了<%s>'%(name,res))
    def consumer(name,p):
    while True:
    res=p.get()
    if res==None:break #从队列中去到None时,结束循环
    time.sleep(random.randint(1,3))
    print('大傻逼%s吃了<%s>..............'%(name,res))
    if __name__ == '__main__':
    q=Queue()
    p1=Process(target=Producer,args=('lmj','水',q))
    p2=Process(target=Producer,args=('lmj2','包子',q))
    p3=Process(target=Producer,args=('lmj3','汤',q))
    c1=Process(target=consumer,args=('lbz',q))
    c2=Process(target=consumer,args=('lmz',q))
    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()
    p1.join() #用join方法保证生产者生产完毕
    p2.join()
    p3.join()
    q.put(None) #生产完毕后向队列中丢入两个None,两个消费者拿到之后就会停止
    q.put(None)
    print('master')
  1.  
  1. import time,random
    from multiprocessing import Process,JoinableQueue
  2.  
  3. def producer(name,food,q):
    for i in range(3):
    res='%s%s' %(food,i)
    time.sleep(random.randint(1,3)) #模拟生产数据的时间
    q.put(res)
    print('厨师[%s]生产了<%s>' %(name,res))
  4.  
  5. def consumer(name,q):
    while True:
    res=q.get()
    time.sleep(random.randint(1,3)) #模拟处理数据的时间
    print('吃货[%s]吃了<%s>' %(name,res))
    q.task_done() #消费者每取走一个值,就会给q.join发信号取走一个值
  6.  
  7. 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=('1',q))
    c2=Process(target=consumer,args=('2',q))
    c1.daemon=True #将消费者设置成主进程的守护进程,主进程一旦结束,消费者也会结束
    c2.daemon=True
  8.  
  9. p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()
  10.  
  11. p1.join()
    p2.join()
    p3.join()
    q.join() # 此时生产者不会再往队列里面添加东西,统计队列里还剩多少值.主进程等q结束,即q内数据被取干净了
    print('主')
  1. 执行结果:
    厨师[小]生产了<水0>
    厨师[中]生产了<包子0>
    厨师[大]生产了<汤0>
    厨师[大]生产了<汤1>
    吃货[2]吃了<水0>
    厨师[小]生产了<水1>
    吃货[1]吃了<包子0>
    厨师[中]生产了<包子1>
    厨师[小]生产了<水2>
    厨师[中]生产了<包子2>
    吃货[2]吃了<汤0>
    厨师[大]生产了<汤2>
    吃货[1]吃了<汤1>
    吃货[2]吃了<水1>
    吃货[1]吃了<包子1>
    吃货[2]吃了<水2>
    吃货[1]吃了<包子2>
    吃货[2]吃了<汤2>
  2.  

python多进程之IPC机制以及生产者消费者模型的更多相关文章

  1. 进程部分(IPC机制及生产者消费者模型)和线程部分

    进程部分 一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间, 但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存 空 ...

  2. 进程间通信IPC机制和生产者消费者模型

    1.由于进程之间内存隔离,那么要修改共享数据时可以利用IPC机制 我们利用队列去处理相应数据 #管道 #队列=管道+锁 from multiprocessing import Queue # q=Qu ...

  3. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

  4. IPC机制和生产者消费者模型

    IPC机制:(解决进程间的数据隔离问题) 进程间通信:IPC(inter-Process Comminication) 创建共享的进程列队,Queue 是多进程的安全列队,可以使用Queue 实现多进 ...

  5. python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02

    目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...

  6. Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  7. 4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型

    一.守护进程 import random import time from multiprocessing import Process def task(): print('name: egon') ...

  8. 【python】-- 队列(Queue)、生产者消费者模型

    队列(Queue) 在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用 队列的好处: 提高双方的效率,你只需要把数据放到队列中,中间去干别的事情. 完成了程序的解耦性,两者关系依赖性没有不大 ...

  9. Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...

随机推荐

  1. linux下的hashpump安装

    hashpump是linux上的一个进行hash长度拓展攻击的工具 安装: git clone https://github.com/bwall/HashPump apt-get install g+ ...

  2. MySql、Mongodb和Redis的区别

    NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...

  3. mysql,apache,php的关系

    首先要明白动态网站与静态网站 所谓的动态网页,是指跟静态网页相对的一种网页编程技术.静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码.而动态网页则不然 ...

  4. Python—后台运行(nohup 、&、 2>&1详解)

    一.脚本文件(test.py) # -*- coding: UTF-8 -*- import time print("hello"," python") os. ...

  5. kubectl 常用命令一

    1.kubectl logs <options>  <PodName> -f -p, --previous --since= No. --since-time= --tail ...

  6. 配对t检验

  7. Django专题-auto模块

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  8. P1781 宇宙总统

    题目地址:https://www.luogu.com.cn/problem/P1781 题目描述:地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 n 个非凡拔尖的人竞选总统,现在票 ...

  9. KeyError: 'xxx does not support field: _id'

    Scrapy存储爬取的数据时,提示不支持某些字段 在Item文件中,添加对应的字段即可

  10. Ubuntu下安装Docker,及Docker的一些常用命令操作

    1.什么是 Docker         Docker 是一个开源项目,Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案.         Docker 的基础是 Linux 容器(LXC ...