'''
进程间的通信
''' """
multiprocessing模块支持进程间通信的两种主要形式:管道和队列
都是基于消息传递实现的,
"""
from multiprocessing import Queue
q = Queue(3) #put, get, put_nowait, get_nowait, full, empty
q.put(1)
q.put(2)
q.put(3)
# q.put(1)#队列已经满了,再加程序就会一直停在这里,等待数据被别人取走,不取走就一直停在这
## q.get(1)#可以先取出一个,然后再加就可以了
## q.put(1)
# try:
# q.put_nowait(1) #使用这个绑定方法,队列满了不会阻塞,但是会因为队列满了而报错。
# except:
# print('队列已经满了') #加了try之后,不阻塞,但是消息会丢
print(q.full())#查看队列是否满了
print(q.get())
print(q.get())
print(q.get()) # q.get(1)#同put 方法一样,队列空了继续取就会出现阻塞。 #和上面方法类似
try:
q.get_nowait()
except:
print('队列已经空了') print(q.empty()) # 子进程数据给父进程
import time
from multiprocessing import Process, Queue def f(q):
q.put([time.asctime(), 'from Eva', 'hello']) if __name__ == '__main__':
q = Queue() #创建一个Queue对象
p = Process(target=f, args=(q, )) #创建一个进程
p.start()
print(q.get())
p.join() #
# #批量生产数据放入队列再批量获取结果
import os
import time
import multiprocessing #向queue中输入数据的函数
def inputQ(queue):
info = str(os.getpid()) + '(put): ' + str(time.asctime())
queue.put(info) #向queue中输出数据的函数
def outputQ(queue):
info = queue.get()
print(f'{str(os.getpid())} (get): {info}') #Main
if __name__ == '__main__':
multiprocessing.freeze_support()
record1 = [] #store input processes
record2 = [] #store output processes
queue = multiprocessing.Queue(3) #输入进程
for i in range(10):
process = multiprocessing.Process(target=inputQ, args=(queue, ))
process.start()
record1.append(process) #输出进程
for i in range(10):
process = multiprocessing.Process(target=outputQ, args = (queue, ))
process.start()
record2.append(process) for p in record1:
p.join() for p in record2:
p.join() import os
import time
import multiprocessing #向队列中输入数据
def inputQ(queue):
info = str(os.getpid()) + '(put):' + str(time.asctime())
queue.put(info) #向队列中输出数据
def outputQ(queue):
info = queue.get()
print(f'{str(os.getpid())} (get: ) {info}') if __name__ == '__main__':
multiprocessing.freeze_support()
p1_list = []
p2_list = []
q = multiprocessing.Queue(3) for i in range(10):
p = multiprocessing.Process(target=inputQ, args=(q, ))
p.start()
p1_list.append(p)
for i in range(10):
p = multiprocessing.Process(target=outputQ, args=(q, ))
p.start()
p2_list.append(p) for k in p1_list:
k.join() for j in p2_list:
j.join() #基于队列实现生产者和消费者模型(生产者生产出来放到阻塞队列里,消费者直接从阻塞队列中取需要的东西)
from multiprocessing import Process, Queue #导入进程和队列模块
import time, random,os#导入时间、随机数和os模块
def consume(q):#定义消费者函数
while True: #循环消费
res = q.get() #从队列中取东西
time.sleep(random.randint(1, 3)) #随机睡几秒
print(f'{str(os.getpid())} 吃 {res}') #打印出来
def producer(q): #定义生产者函数
for i in range(10): #生产10个包子
time.sleep(random.randint(1, 3)) #随机睡几秒
res = f'包子{i}' #生产包子标记下来
q.put(res) #把包子放到阻塞队列里面
print(f'生产了{(os.getpid(), res)}') #打印东西
if __name__ == '__main__':
q = Queue() #阻塞队列
#生产者们:即厨师们
p1 = Process(target=producer, args=(q, )) #消费者们:即吃货们
c1 = Process(target=consume, args=(q, )) #开始
p1.start()
c1.start()
print('主') #生产者和消费者(改良版)
'''
上面的版本主进程永远不会结束,原因是:生产者p在生产完后就结束了,
但是消费者c在取空了q之后,一直处于死循环卡在q.get这一步 解决方法是生产者生产完成之后,网队列中组发一个结束信号,这样消费者在接收到结束
信号后就可以break出死循环 注意:结束信号None,不一定要由生产者发,主进程里面同样可以发,但主进程需要
等生产者结束后才应该发送该信号
'''
import os, random, time
from multiprocessing import Process, Queue #定义消费者函数
def consume(queue):
while True:
res = queue.get()
if res is None:break #收到结束信号则结束
time.sleep(random.randint(1, 3))
print(f'{str(os.getpid())} 吃了 {res}') #定义生产者函数
def producer(queue):
for i in range(10):
time.sleep(random.randint(1, 3))
res = f'包子{i}'
queue.put(res)
print(f'{os.getpid()}生产了{res}')
# queue.put(None) #生产者发送结束信号 if __name__ == '__main__':
q = Queue(3) #生产者
p = Process(target=producer, args=(q, )) #消费者
q1 = Process(target=consume, args=(q, )) p.start()
q1.start() p.join()
q.put(None) #主进程里面发送结束信号
q1.join() #可加可不加 print('主线程') # 多个消费者就需要发送多个None
from multiprocessing import Process,Queue
import time,random,os
def consumer(q):
while True:
res=q.get()
if res is None:break #收到结束信号则结束
time.sleep(random.randint(1,3))
print('%s 吃 %s' %(os.getpid(),res)) def producer(name,q):
for i in range(2):
time.sleep(random.randint(1,3))
res='%s%s' %(name,i)
q.put(res)
print('生产了 %s %s' %(os.getpid(),res)) if __name__ == '__main__':
q=Queue()
#生产者们:即厨师们
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,)) #开始
p1.start()
p2.start()
p3.start()
c1.start() # 必须保证生产者全部生产完毕,才应该发送结束信号
p1.join()
p2.join()
p3.join() # 有几个消费者就应该发送几次结束信号None
q.put(None)
q.put(None) #发送结束信号
print('主') #JoinableQueue队列实现消费者与生产者模型
from multiprocessing import Process,JoinableQueue
import time,random,os
def consumer(q):
while True:
res=q.get()
time.sleep(random.randint(1,3))
print('%s 吃 %s' %(os.getpid(),res))
#向q.join()发送一次信号,证明一个数据已经被取走了
q.task_done() def producer(name,q):
for i in range(2):
time.sleep(random.randint(1,3))
res='%s%s' %(name,i)
q.put(res)
print('生产了 %s %s' %(os.getpid(),res))
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=True #设置成守护进程
c2.daemon=True #设置成守护进程 #开始
p_1 = [p1, p2, p3, c1, c2]
for p in p_1:
p.start()
# 必须保证生产者全部生产完毕,才应该发送结束信号
p1.join()
p2.join()
p3.join()
print('主')
'''
主进程等--->p1, p2, p3等--->c1, c2
p1, p2, p3结束了,证明c1, c2肯定全部收完了p1, p2, p3发到队列的数据
因而c1, c2也没有存在的价值了,不需要继续阻塞在进程中影响主进程了,
应该随着主进程的结束而结束,所以设置成守护进程就可以了
'''

Python并发编程之进程通信的更多相关文章

  1. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  2. Python并发编程之进程池与线程池

    一.进程池与线程池 python标准模块concurrent.futures(并发未来) 1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用 2. ...

  3. Python并发编程之进程

    一.理论概念 1.定义 进程(Process 也可以称为重量级进程)是程序的一次执行.在每个进程中都有自己的地址空间.内存.数据栈以及记录运行的辅助数据,它是系统进行资源分配和调度的一个独立单位. 2 ...

  4. python并发编程之进程池,线程池concurrent.futures

    进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...

  5. python并发编程之进程池,线程池,协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  6. python并发编程之进程池、线程池、协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  7. 15.python并发编程(线程--进程--协程)

    一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...

  8. Python网络编程(进程通信、信号、线程锁、多线程)

    什么是进程通讯的信号? 用过Windows的我们都知道,当我们无法正常结束一个程序时, 可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢? 同样的功能在Linux上是通过生成信号和捕获信号来实 ...

  9. python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞

    操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两 ...

随机推荐

  1. 姿态角(RPY)的优化目标函数

    在Pose-Graph的过程中,如果使用G2O优化函数库,那么似乎是不用自己编写代价函数(也就是优化目标函数)的,因为G2O有封装好的SE3等格式,使得Pose-Graph的过程变得简单了,即只需要设 ...

  2. Golang(十)TLS 相关知识(一)基本概念原理

    0. 前言 最近参与一个基于 BitTorrent 协议的 Docker 镜像分发加速插件的开发,主要参与补充 https 协议 学习了 TLS 相关知识,下面对之前的学习做一下简单总结 参考文献:T ...

  3. 另一种缓存,Spring Boot 整合 Ehcache

    用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...

  4. WPF DataGird 类似Excel筛选效果 未成品

    这个本是针对MSDN上所写的代码,不过写一半不想写了. 不想浪费代码,是个半成品的半成品. 效果图: 思路: 利用PopUp来做显示层. 显示层中的数据则是绑定到Datagrid的数据. popup中 ...

  5. 【leetcode-200 深度优先+广度优先】 岛屿数量

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

  6. Linux学习笔记之AIX系统上压缩与解压文件

    0x00 概述 AIX机器真难用,一时半会还真适应不了.   0x01 压缩tar 命令格式: # tar -cvf (或xvf)+文件名+设备 C:是本地到其他设备 x:是其他设备到本地 r:是追加 ...

  7. eclipse自定义导入或者编写版本格式化 xml

    1.自定义或者自己导入版本格式 window——preferences——java——Code style ——formatter(New 或者 import)

  8. Mark: 如何用Haskell写一个简单的编译器

    作者:aaaron7 链接:https://www.zhihu.com/question/36756224/answer/88530013 如果是用 Haskell 的话,三篇文章足矣. prereq ...

  9. iOS11里判断Safari浏览器是无痕模式还是正常模式?

    var isPrivate = false; try { window.openDatabase(null, null, null, null); } catch (_) { isPrivate = ...

  10. Matlab空对象模式

    在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查.Null 对象不是检查空值,而是反应一个不做任何动作的关系.这样的 Null 对象也可以在数据不可用 ...