1:进程间通讯的方法:apply_async()非阻塞式通讯     apply()阻塞式通讯

2:使用Queue实现对Process创建的进程间通讯,

Queue本身是一个消息队列程序,Queue常用方法:

Queue.qsize():返回当前消息队列的消息数量
Queue.empty():如果队列为空,返回true 否则返回false
Queue.full():如果队列满了,返回true,否则false
Queue.get():获取队列中的一条消息,然后将其从队列中移除
Queue.put(“xxx”):把内容存放进消息队列
Queue.get_nowait()相当于Queue.get(False) Queue.put_nowait()相当于Queue.put(False)

例子:

#叫做队列
from multiprocessing import Queue
from multiprocessing import Process
list = ["lipeng","王五","赵四"]
def write(q):
for temp in list:
print("---%s write to queue"%temp)
q.put(temp)
def read(q):
while 1:
if not q.empty():
value = q.get()
print("--get %s from queue"%value)
else:
print("queue is empty")
break if __name__ == '__main__':
q = Queue()
pw = Process(target=write,args=(q,))
pr = Process(target=read,args=(q,))
pw.start()#启动子进程,开始写
pw.join()#等待pw进程结束
pr.start()
pr.join()

程序输出:

3: 进程池间通讯方式的实现

Process创建的进程可以使用Queue进行通讯,而进程池Pool创建的进程通讯使用Manager中的Queue来初始化,就不需要再导入Queue模块。

先看例子:

​​from multiprocessing import Pool,Manager
#from multiprocessing import Queue
def write(q):#定义写入队列的函数
list = ["111", "222", "555", "666"] if not q.full():
for temp in list:
print("write %s to Queue"%temp)
q.put(temp)
else:
print("queue is full") def read(q):
while True:
if not q.empty():
value = q.get()
print("get %s from queue"%value)
else: print("queue ir empty")
print("所有数据读写完毕")
break if __name__ == '__main__':
#创建队列
q = Manager().Queue()#使用Manager中的Queue来初始化
#创建写进程
po = Pool()
#使用阻塞模式创建进程,这样就不需要在read中使用死循环,可以让write执行完成后再用read进程
po.apply(write,(q,))
po.apply(read,(q,))
po.close()
po.join()

程序输出如下:

很累很累,但我还是要解释一下这个代码:

首先导入mutiprocessing模块下的Process类Manager类,定义write函数实现把数据写入队列,定义read函数实现对队列中的消息进行读取。

在write函数中以队列q(使用Manager中的Queue来初始化),判断队列是否满,遍历要写入的数据使用put方法写入。否则输出队列已满

在read函数中以队列q(使用Manager中的Queue来初始化),判断队列时候是空,使用get方法和遍历队列获取每一个队列中的值并输出。

在程序入口处先创建队列,声明进程池,在选择使用阻塞式模式创建进程,最后关闭子进程,结束父进程。

python进程间的通讯实现的更多相关文章

  1. 进程间的通讯(IPC)方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...

  2. [转]WINDOW进程间数据通讯以及共享内存

    1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...

  3. python 进程之间的通讯

    python 进程之间的通讯 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/28 10:15 # ...

  4. 【转】C++ 进程间的通讯(一):简单的有名管道实现

    原文: C++ 进程间的通讯(一):简单的有名管道实现 -------------------------------------------------- 进程间的通讯(一):简单的有名管道实现   ...

  5. python进程间共享数值、字典、列表变量

    ##python进程间共享数值.字典.列表变量 关注公众号"轻松学编程"了解更多. import multiprocessing def worker(num, mgr_dict, ...

  6. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  7. 进程间的通讯————IPC

    """ IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放 ...

  8. python 进程间共享数据 (二)

    Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  9. .Net下的进程间的通讯 -- Windows消息队列

    Windows 消息队列(MSMQ),是微软Windows2000以上的操作系统的一个服务,可以提供在计算机间消息的可靠传输,用来在两个进程间进行异步通讯最合适不过了.在.Net中有一个Message ...

随机推荐

  1. SpringBoot面试题 (史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  2. NOIP模拟测试24「star way to hevaen·lost my music」

    star way to heaven 题解 大致尝试了一下并查集,记忆化搜索,最小生成树 最小生成树是正解,跑最小生成树然后找到最大的值 欧几里德距离最小生成树学习 prim楞跑 至于为什么跑最小生成 ...

  3. Linux关闭打开防火墙命令

    Linux下打开和关闭防火墙 1.及时生效,重启后复原 关闭:service iptables stop  开启:service iptalbes start  查看状态:service iptabl ...

  4. 从HTTP到HTTPS

    从HTTP到HTTPS HTTP存在的缺陷 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡改 防窃听 通信加密 HTTP 协议 ...

  5. Spring Boot 2.x基础教程:使用Redis的发布订阅功能

    通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...

  6. Linux 命令行查看etcd v2所有的Key

    etcd 是一个树型的数据结构,这样看所有的key: curl localhost:2379/v2/keys 这样看某个key的内容: curl localhost:2379/v2/keys/key ...

  7. 动态路由及RIP协议

    动态路由及 RIP协议 目录 一.动态路由协议 1.1.定义 1.2.特点 1.3.动态路由协议概述 1.4.度量值 1.5.收敛 1.6.静态路由和动态路由的比较 二.动态路由协议的分类 2.1.距 ...

  8. Docker笔记--操作容器命令

    Docker笔记--操作容器命令 创建容器 docker [container] create-- 创建容器,使用docker [container] create命令新建的容器处于停止状态,可以使用 ...

  9. Unity Lamba错误集

    请先看对象层级视图 /// <summary> /// 选择关卡的内容对象 /// </summary> public Transform Transform_levelCon ...

  10. C#调用JAVA(一)制作jar包

    1 //AndroidJavaClass类可以理解为某一个类 2 //AndroidJavaObject类可以理解为某一个类中的一个对象 打开AS,创建一个空项目 输入项目名,包名,本地路径以及语言之 ...