python-- 进程管道 Pipe、进程 Manager
时间:2021-08-08
本文章向大家介绍python-- 进程管道 Pipe、进程 Manager,主要包括python-- 进程管道 Pipe、进程 Manager使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
进程管道 Pipe
管道之间通信是不安全的
from multiprocessing import Pipe con1,con2 = Pipe()
管道是用于多进程之间通信的一种方式。如果在单进程中使用管道,那么就是con1收数据,就是con2发数据。如果是con1发数据,就是con2收数据如果在多进程中使用管道,那么就必须是父进程使用con1收,子进程就必须使用con2发
父进程使用con1发,子进程就必须使用con2收
父进程使用con2收,子进程就必须使用con1发
父进程使用con2发,子进程就必须使用con1收
在管道中有一个著名的错误叫做EOFError。是指,父进程中如果关闭了发送端,子进程还继续接收数据,那么就会引发EOFError。
from multiprocessing import Pipe, Process def func(con): con1, con2 = con con1.close() # 子进程使用con2和父进程通信,所以 while 1: try: print(con2.recv()) # 当主进程的con1发数据时,子进程要死循环的去接收。 except EOFError: # 如果主进程的con1发完数据并关闭con1,子进程的con2继续接收时,就会报错,使用try的方式,获取错误 con2.close() # 获取到错误,就是指子进程已经把管道中所有数据都接收完了,所以用这种方式去关闭管道 break if __name__ == '__main__': con1, con2 = Pipe() p = Process(target=func, args=((con1, con2),)) p.start() con2.close() # 在父进程中,使用con1去和子进程通信,所以不需要con2,就提前关闭 for i in range(10): # 生产数据 con1.send(i) # 给子进程的con2发送数据 con1.close() # 生产完数据,关闭父进程这一端的管道
结果:
0
1
2
3
4
5
6
7
8
9
例
from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello fromchild']) conn.send([42, None, 'hello fromchild2']) print("from parent:", conn.recv()) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() # 需要两个参数接收 p = Process(target=f, args=(child_conn,)) p.start() print(parent_conn.recv()) print(parent_conn.recv()) parent_conn.send("范冰冰")
结果:
[42, None, 'hello fromchild'] [42, None, 'hello fromchild2'] from parent: 范冰冰
parent_conn, child_conn = Pipe()生成管道实例,相当于socket通信,一头在主进程,一头在子进程,就可以实现进程之间的数据的传递
进程 Manager
Queue,Pipe只能实现进程之间数据的传递,Manager可以进行数据之间的共享
from multiprocessing import Manager, Value m = Manager() num = m.dict({键: 值}) num = m.list([1, 2, 3])
例
from multiprocessing import Process, Manager def func(num): num[0] -= 1 # num[0] = 1 print('子进程中的num的值是', num) if __name__ == '__main__': m = Manager() num = m.list([1, 2, 3]) p = Process(target=func, args=(num,)) p.start() p.join() print('父进程中的num的值是', num)
结果:
子进程中的num的值是 [0, 2, 3]
父进程中的num的值是 [0, 2, 3]
原文地址:https://www.cnblogs.com/zouzou-busy/p/13775382.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Keras 数据增强ImageDataGenerator多输入多输出实例
- TensorFlow中如何确定张量的形状实例
- 使用Dajngo 通过代码添加xadmin用户和权限(组)
- python和js交互调用的方法
- Python中flatten( ),matrix.A用法说明
- python中id函数运行方式
- CentOS 7如何实现定时执行python脚本
- PHP自动生成缩略图函数的源码示例
- 解决tensorflow 释放图,删除变量问题
- php生成word并下载代码实例
- TensorFlow保存TensorBoard图像操作
- 浅谈PHP SHA1withRSA加密生成签名及验签
- PHP PDO数据库操作预处理与注意事项
- laravel 框架配置404等异常页面
- Django –Xadmin 判断登录者身份实例