管道(pipe),进程之间的共享内存(Manager,Value)
1 管道(了解) 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
con1,con2 = Pipe()
con1.send('abc')print(con2.recv())con2.send(123)print(con1.recv())
多管道代码:
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()# 生产完数据,关闭父进程这一端的管道
2 进程之间的共享内存 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 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)
管道(pipe),进程之间的共享内存(Manager,Value)的更多相关文章
- Linux 基于IPC机制实现进程间的共享内存处理
今天学习了相关于IPC(InterProcess Communication ,进程间通信)的相关知识.就做个笔记,一来让大家检查一下我的理解方面是不是有错误,二来也为了能让更多的博友们了解到相关的知 ...
- 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)
在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...
- PHP进程通信基础——信号量+共享内存通信
PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...
- Linux进程通信之共享内存实现生产者/消费者模式
共享内存 共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间.这是最快的进程间通信方式,但是不提供任何同步功能( ...
- linux 进程通信之 共享内存
共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API k ...
- Linux 进程通信(共享内存区)
共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也 ...
- win32进程间通讯--共享内存
小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...
- 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket
进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...
- Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字
Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
随机推荐
- linux 读取物理寄存器
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h ...
- matlab reshape()、full()
一.reshape() 对于这个函数,就是重构矩阵. (1)要求:重构前后的矩阵元素个数一致.如3*4矩阵可以重构成2*6,2*3*2等. (2)重构方法:先按列将矩阵转换为向量,然后在向量的基础之上 ...
- Adobe Flash Player - imsoft.cnblogs
Adobe Flash Player是一个跨平台.基于浏览器的应用程序.运行时,它可以跨屏幕和浏览器原汁原味地查看具有表现力的应用程序.内容和视频.Flash Player实现了移动屏幕上的高性能优化 ...
- Elasticsearch 索引的全量/增量更新
Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...
- (1)什么是socket(套接字)
什么是套接字socket socket把传输层以下的协议都封装成了简单的接口,我编写基于网络通信的软件只需要调用这些接口即可,写出的程序自然是遵循tcp/udp协议的.... 什么是互联网 互联网=物 ...
- (转)函数库调用 VS 系统调用
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).可以参考<Linux程序设计>(英文原版为<Beginning ...
- System帐户!我使用你登陆
大家知道,SYSTEM是至高无上的超级管理员帐户.默认情况下,我们无法直接在登录对话框上以SYSTEM帐户的身份登录到Windows桌面环境.实际上SYSTEM帐户早就已经“盘踞”在系统中了.想想也是 ...
- mysql常用的聚合函数
GROUP BY(聚合)函数本章论述了用于一组数值操作的 group (集合)函数.除非另作说明, group 函数会忽略 NULL 值. 假如你在一个不包含 ROUP BY子句的语句中使用一个 gr ...
- 防范SQL注入漏洞攻击
原理:通过拼sql语句,在输入框里输入' ; SHOW TABLES;注入这样的代码, 防范:你把全部的特殊符号都过滤掉(如单引号,双引号),自然就不会被注入 使用mysql_real_escape_ ...
- greasemonkey修改网页url
// ==UserScript== // @name JSHE_ModifyFunction // @namespace jshe // @include http://localhost/* // ...