1. 进程之间的通信(IPC)队列和管道
    一.队列 基于管道实现 管道 + 数据安全
    (一).队列
    队列遵循先进先出原则(FIFO)
    多用于维护秩序,买票,秒杀
    队列的所有方法:
    put()(给队列里添加数据),put_nowait(),
    get()(从队列中获取数据),get_nowait(),
    相同点:有值的时候取值
    区别:get()没有值时会阻塞
    get_nowait() 没有值时会报错
    full()(返回布尔值),empty()(返回bool值),
    qsize()(队列大小)
  1. 示例:
  2. from queue import Queue
  3. q=Queue()
  4. print(q.qsize()) #
  5. q.put()
  6. q.put()
  7. q.put()
  8. q.put()
  9. # q.put_nowait() #已知队列长度,队列未放满数据执行此方法会报错
  10. # 报错信息: TypeError: put_nowait() missing required positional argument: 'item'
  11. q.put()
  12. print(q.qsize()) #
  13. print(q.full()) #True #队列满了返回True.
  14. print(q.get())
  15. print(q.get())
  16. print(q.get())
  17. print(q.get())
  18. print(q.get())
  19. print(q.empty()) #True 队列里无值返回True
  20. print(q.qsize()) # 以上五步取出队列中的数据,此时队列长度是0.
  21. # q.get() #队列里无值,用此方法程序阻塞不返回任何东西
  22. # q.get_nowait() #队列里无值,用此方法程序会报错,报错信息:queue.Empt
  1. 补充知识:
    栈 :先进后出  
    应用:三级菜单  计算文件夹的总大小
    (二).进程中的队列
    进程中的队列方法:
    empty(), full()在多进程中是不可靠
    put(),put_nowait()
    get(),get_nowait()
  1. 示例:
  2. from multiprocessing import Queue
  3. q=Queue()
  4. q.put()
  5. q.put()
  6. q.put()
  7. print(q.qsize()) #
  8. # q.put_nowait() # 未给队列传参数或报错TypeError: put_nowait() missing required positional argument: 'obj'
  9. print(q.get()) #
  10. print(q.get()) #
  11. print(q.get()) #
  12. print(q.qsize()) #
  13. q.get() #无值不返回
  14. q.get_nowait() #无值会报错queue.Empty
  1. 主进程放 子进程取
  1. from multiprocessing import Queue,Process
  2. def con(q): #定义一个con函数 传一个参数 q 是创建的队列对象
  3. print(q.get()) #获取队列数据,如果没有数据则一直阻塞直到有数据为止
  4. if __name__=="__main__": #在这一判断条件下面创建子进程
  5. q=Queue() #创建一个队列对象
  6. p=Process(target=con,args=(q,)) #创建一个子进程子进程对象为con,并传一个参数q.
  7. p.start() #申请开启子进程
  8. q.put() #给队列中添加数据
  1. 子进程放,另一个子进程取
  1. from multiprocessing import Queue,Process
  2. def con(q): #定义一个con函数 传一个参数 q 是创建的队列对象
  3. print(q.get()) #获取队列数据,如果没有数据则一直阻塞直到有数据为止
  4. if __name__=="__main__": #在这一判断条件下面创建子进程
  5. q=Queue() #创建一个队列对象
  6. p=Process(target=con,args=(q,)) #创建一个子进程子进程对象为con,并传一个参数q.
  7. p.start() #申请开启子进程
  8. q.put() #给队列中添加数据
  1. 生产者消费者模型
    --解决创造(生产)数据和处理(消费)数据的效率不平衡问题
    把创造数据和处理数据放在不同的进程中
    根据他们的效率来调整进程的个数
    生产数据快 消费数据慢 内存空间的浪费
    生产数据慢 消费数据快 效率低下
  1. import time
  2. import random
  3. from multiprocessing import Queue,Process
  4. def consumer(q,name):#创建一个函数消费者
  5. while True: #无限循环
  6. food=q.get() # 获取队列中数据
  7. if food=="stop":break #.判断获取的数据是否是结束符,如果是则停止获取数据(消费食物)
  8. print("%s吃了%s"% (name,food)) #.提示消费者吃了生产者生产的食物
  9. time.sleep(random.random()) #.消费者消费食物需要一定的时间 5_8 重复一次(消费者进程进行了两次)
  10.  
  11. def producer(q,name,food,n=):#创建一个函数生产者
  12. for i in range(n): #.生产者生产食物的数量计数器
  13. time.sleep(random.random()) #.生产食物需要消耗一定的时间
  14. fd=food+str(i) #11给食物标号
  15. print("%s生产了%s"% (name,fd)) #12提示生产者生产的食物
  16. q.put(fd) #13把食物放进队列 -18重复一遍 ,生产者进程进行了两次
  17.  
  18. if __name__=="__main__":#在此判断条件下创建一个子进程
  19. q=Queue() #创建一个队列
  20. c=Process(target=consumer,args=(q,"alex"))#创建一个消费者子进程,,传两个参数
  21. c.start() #申请开启子进程
  22. c1=Process(target=consumer,args=(q,"alex")) #再创建一个消费者子进程,传两个参数
  23. c1.start()#申请开启子进程
  24. p=Process(target=producer,args=(q,"太白","食物")) #创建一个生产者子进程,传三个参数
  25. p.start()#申请开启子进程
  26. p1 = Process(target=producer, args=(q, "egon", "甜点"))#再创建一个生产者子进程,传三个参数
  27. p1.start()#申请开启子进程
  28. p.join() #第一个生产者生产结束再执行下一步
  29. p1.join() #第二个生产者生产结束再执行下一步
  30. q.put("stop") #全部生产者生产结束以后 再发送结束符
  31. q.put("stop") #有几个消费者就发送几个结束符
  1. consumer 停下来的方法
    在所有生产者结束生产之后,向队列中放入一个结束符
    有几个消费者就向队列中放入几个结束符
    在消费者消费的过程中,接收到结束符,就结束消费的进程
  2.  
  3. 生产者消费者模型 ---JoinableQueue
  1. import time
  2. import random
  3. from multiprocessing import JoinableQueue,Process
  4. def consumer(q,name):#创建消费者函数
  5. while True: #.无限循环
  6. food=q.get() #.获取队列中的食物
  7. print("%s吃了%s" %(name,food))#8提示消费者吃了食物
  8. time.sleep(random.random()) #.消费者消费食物需要时间
  9. q.task_done() #.每消费完一个食物就给生产者发送一次信息 - 以此类推
  10.  
  11. def producer(q,name,food,n=):#创建生产者函数
  12. for i in range(): #.无限循环 - 以此类推
  13. time.sleep(random.random()) #.生产食物需要耗费时间
  14. fd=food+str(i) #.生产食物名+序号
  15. print("%s生产了%s"%(name,fd))#.提示生产者生产了食物
  16. q.put(fd) #.将生产的食物添加到队列中
  17. q.join() #等消费者全部消费结束之后才结束阻塞#
  18.  
  19. if __name__=="__main__":#在此条件下创建一个子进程
  20. q=JoinableQueue() #创建一个队列(JoinableQueue)
  21. c=Process(target=consumer,args=(q,"alex")) #创建一个消费者进程两个参数
  22. c.daemon=True #设置守护进程
  23. c.start() #申请开启消费者进程
  24. c1=Process(target=consumer,args=(q,"alex")) #在创建一个消费者进程,传两个参数
  25. c1.daemon=True #设置守护进程
  26. c1.start() #申请开启另一个消费者进程
  27. p=Process(target=producer,args=(q,"太白","食物")) #创建一个生产者进程 传三个参数
  28. p.start() #申请开启一个消费者进程
  29. p1=Process(target=producer,args=(q,"egon",'甜点')) #再创建一个生产者进程,传三个参数
  30. p1.start() #申请开启另一个生产者进程
  31. p.join() #结束第一个生产者进程后再执行后面的代码
  32. p1.join() #结束第二个生产者进程后结束主程序 (守护程序直接结束)(消费者程序结束)
  1. 总结 :
  1. 只有multiprocessing中的队列才能帮助你实现IPC(进程之间的通信)
  2. 永远不可能出现数据不安全的情况,多个进程不会同时取走同一个数据
  3. 由于先进先出的特点 + 进程通信的功能 + 数据进程安全,经常用它来完成进程之间的通
  1. 生产者消费者模型
  1. 生产者和消费者的效率平衡的问题
  2. 内存的控制--队列的长度限制
  3. 让消费者自动停下来
  1. JoinableQueue
  1. 在消费数据的时候 task_done
  2. 在生产端\主进程 join
  3. 流程:
  4. 消费者消费完毕
  5. 生产者结束阻塞
  6. 主进程代码结束
  7. 守护进程结束=>消费者结束
  1. 二.管道 数据不安全
  1. 示例:
  2. from multiprocessing import Pipe
  3. left,right=Pipe()
  4. left.send("888")
  5. print(right.recv())

 管道第一版:

  1. from multiprocessing import Pipe,Process
  2. def consumer(left,right):
  3. left.close() # 一个进程中,如果接收时其中一端关闭, 另一端开启在无限循环接收中会报错,
  4. while True: #左右两端都开启则可以无限循环接收,不会报错
  5. try:
  6. print(right.recv()) #接收信息
  7. except EOFError:
  8. break
  9. if __name__=="__main__":
  10. left,right=Pipe() #创建一个管道
  11. p=Process(target=consumer,args=(left,right)) #创建一个consumer子进程,传两个参数
  12. p.start() #申请开启一个子进程
  13. right.close() #关闭右管道口
  14. for i in range(): #计数器
  15. left.send("hello") #左管道口发送信息(发送十次)
  16. left.close() #所有信息发完关闭右管道口
  17. EOF异常的触发:
  18. 在这一个进程中,如果不再用这个端点了,应该close.
  19. 这一在recv的时候,如果其他端点都被关闭了,就能够知道不会再有新的消息传进来
  20. 此时就不会在这里阻塞等待,而是抛出一个EOFError
  21. close并不是关闭了整个管道,而是修改了操作系统对管道端点的引用
  1. 一个进程发另一个进程收
  1. from multiprocessing import Process,Pipe
  2. def consumer(p,name):
  3. produce,consume=p
  4. produce.close()
  5. while True:
  6. try:
  7. food=consume.recv()
  8. print("%s收到%s"%(name,food))
  9. except EOFError:
  10. break
  11.  
  12. def producer(p,sep=):
  13. produce,consume=p
  14. consume.close()
  15. for i in range(sep):
  16. produce.send(i)
  17.  
  18. if __name__=="__main__":
  19. produce,consume=Pipe()
  20. for i in range():
  21. c=Process(target=consumer,args=((produce,consume),"c1"))
  22. c.start()
  23. for i in range():
  24. p=Process(target=producer,args=((produce,consume),))
  25. p.start()
  26. producer((produce,consume))
  27. produce.close()
  28. consume.close()
  1. 进程之间的数据共享
  1. from multiprocessing import Manager,Process,Lock
  2. def work(d,lock):#定义一个work函数 传两个参数
  3. with lock:
  4. d["count"]-=#字典的count对应的值减一
  5.  
  6. if __name__=="__main__":
  7. lock=Lock()
  8. m=Manager()
  9. dic=m.dict({"count":})
  10. p_l=[]
  11. for i in range():
  12. p=Process(target=work,args=(dic,lock)) #创建一个work子进程 传两个参数dic,lock,一共创建一百个
  13. p_l.append(p) #每创建一个进程就添加进列表中
  14. p.start() #每创建一个就申请开启一个
  15. for p in p_l: #循环遍历列表中每一个进程
  16. p.join() #直到所有进程都结束再执行后面的代码
  17. print(dic) # 最后打印字典

python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726的更多相关文章

  1. python 全栈开发,Day133(玩具与玩具之间的对话,基于jieba gensim pypinyin实现的自然语言处理,打包apk)

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.6.zip 注意:由于涉及到 ...

  2. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  3. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  4. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  5. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  6. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  7. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  8. 自学Python全栈开发第一次笔记

           我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...

  9. python全栈开发-Day2 布尔、流程控制、循环

    python全栈开发-Day2 布尔 流程控制 循环   一.布尔 1.概述 #布尔值,一个True一个False #计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人 ...

  10. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

随机推荐

  1. hive使用python脚本导致java.io.IOException: Broken pipe异常退出

    反垃圾rd那边有一个hql,在执行过程中出现错误退出,报java.io.IOException: Broken pipe异常,hql中使用到了python脚本,hql和python脚本最近没有人改过, ...

  2. WPF双向数据绑定总结

    参考官方:https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/data/data-binding-wpf 实例程序:https://files. ...

  3. IDEA创建多个模块MavenSpringBoot项目

    最近在学习springboot,先从创建项目开始,一般项目都是一个项目下会有多个模块,这里先创建一个最简单的实例,一个项目下有一个springboot模块项目提供web服务,引用另一个java项目(相 ...

  4. linux 杀死进程

    列车进程 ps -ef 杀死进程 - 后面是pid kill 1234356

  5. 在GDAL中添加GDALRasterizeGeometriesBuf函数

    缘起 GDAL的栅格化算法中有GDALRasterizeLayers.GDALRasterizeLayersBuf和GDALRasterizeGeometries函数,但是没有GDALRasteriz ...

  6. Navicat http 通道增加验证

    ntunnel_mysql.php 中增加 function check() { if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authen ...

  7. MySQL导出TSV格式文件

    可以使用mysqldump, 也可以使用mysql -e 使用mysqldump 因为要使用到 -T / --tab 参数, 需要先查看mysql设置的secure_file_priv mysql&g ...

  8. Mysql中的定时任务

    一.说明 后台周期定时任务可以有多种解决方案,我所知道的大概有以下几种: 后台框架自带定时任务.比如php中的Laravel框架里有提供定时任务操作接口,其他的框架大家可以单独针对了解. 服务器操作系 ...

  9. js 模仿jquery 写个简单的小demo

    <div id="div" style="background:red;width:100px;height:300px"> 123123123 & ...

  10. python 中 __init__方法

    注意1,__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. class A(object): def __init__(self,name): self.name=name ...