进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息。

IPC通过有管道(无名管道 和 有名 / 命名管道)、消息队列、共享存储 / 内容、信号量、套接字socket、streams,其中socket和streams支持不同主机上的两个进程间通信

1 管道Pipe的基本语法

管道Pipe是multiprocessing中的方法Pipe(),也即multiprocessing.Pipe()

multiprocessing.Pipe([duplex])

功能:创建管道对象

参数:可选参数,

如果不设置参数,表示默认True,此时为全双工通信;

如果设置为False,则表示单向通信,也即一个返回值只能接受,第二个返回值只能发送

返回值:返回两个值,表示管道的两端,一端调用send发送消息,一端调用recv接受消息

注意:管道必须有发送端和接受端,不能只有单端;

无发送端,有接受端,会阻塞在recv,程序无法结束

   有发送端,无接受端,程序可以结束,但没有msg消息

特点:

1)半双工(即数据只能在一个方向上流动)时具有固定的读端和写端。

2)只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

2 应用实例

from multiprocessing import Process,Pipe
import time
import os

child,parent = Pipe()#默认为True,全双工,false时为单向通信

def fun(name):
    time.sleep(1)
    child.send('hello' + str(name))#将send中的内容发送出去
    # parent.send('hello' + str(name))#将child位置变换一下,双工条件下依然正常运行
    print(os.getppid(),"--------",os.getpid())
    return

jobs = []

for i in range(5):
    p = Process(target= fun, args=(i,))
    jobs.append(p)
    p.start()

for n in range(5):
    print(parent.recv())#用于接受send发送的mag
    # print(child.recv())#将parent位置变换一下,双工条件下依然正常运行

for j in jobs:
    j.join()#[1,2,3,4,5]在这些编号中如果1号进程没结束,2号进程也没结束,首先内核先记录2号,阻塞1号,待1号结束后,再执行2号,但是这些编号中没有先后顺序

运行

2809 ------ 2810
hello0
2809 ------ 2811
2809 ------ 2812
hello1
hello2
2809 ------ 2814
hello4
2809 ------ 2813
hello3
***********************

注意:5个进程执行时没有时间顺序

实例2

import multiprocessing
import time

def proc1(pipe):
    while True:
        for i in range(10000):
            print("send: %s" %(i))
            pipe.send(i)
            time.sleep(1)

def proc2(pipe):
    while True:
        print("proc2 rev:", pipe.recv())
        time.sleep(1)

def proc3(pipe):
    while True:
        print("proc3 rev:", pipe.recv())
        time.sleep(1)

if __name__ == "__main__":
    pipe = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=proc1, args=(pipe[0],))
    p2 = multiprocessing.Process(target=proc2, args=(pipe[1],))
    #p3 = multiprocessing.Process(target=proc3, args=(pipe[1],))

    p1.start()
    p2.start()
    #p3.start()

    p1.join()
    p2.join()
    #p3.join()

运行

send: 0
proc2 rev: 0
send: 1
proc2 rev: 1
send: 2
proc2 rev: 2
send: 3
proc2 rev: 3
send: 4
proc2 rev: 4
...

实例2参考:

Python多进程编程

进程间的五种通信方式介绍

python中multiprocessing模块之Pipe管道

Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信

python学习笔记——multiprocessing 多进程组件 Pipe管道的更多相关文章

  1. python学习笔记——multiprocessing 多进程组件-队列Queue

    1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...

  2. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  3. python学习笔记——multiprocessing 多进程模块Process

    系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...

  4. python学习笔记——multiprocessing 多进程中的重构方法__init__

    重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...

  5. python学习笔记之四-多进程&多线程&异步非阻塞

    ProcessPoolExecutor对multiprocessing进行了高级抽象,暴露出简单的统一接口. 异步非阻塞 爬虫 对于异步IO请求的本质则是[非阻塞Socket]+[IO多路复用]: & ...

  6. Python学习笔记进阶篇——总览

    Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...

  7. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  8. Python学习笔记九

    Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...

  9. Python学习笔记,day5

    Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...

随机推荐

  1. 混沌数学之Duffing(杜芬)振子

    杜芬振子 Duffing oscillator是一个描写强迫振动的振动子,由非线性微分方程表示 杜芬方程列式如下: 其中 γ控制阻尼度 α控制韧度 β控制动力的非线性度 δ驱动力的振幅 ω驱动力的圆频 ...

  2. Linux上磁盘挂载

    Linux磁盘挂载   一.  磁盘分区 在终端输入fdisk –l 命令查看整个系统的分区情况. 能够看到另一个32G的/dev/vdb磁盘没有挂载使用 watermark/2/text/aHR0c ...

  3. [CSS3] Parent relative and child absoulte

    如果在一个容器中的子元素使用了position:absolute, 那么他可能会跑出父元素的框架范围. 如果想限定子元素在付元素的框架范围,可以在父元素上加position:relative; 对于一 ...

  4. 漫谈单点登录(SSO)(淘宝天猫)(转载)

    1. 摘要 ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,深感歉意!!!) SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开 ...

  5. Vim使用进阶

    作为一个使用vim挺长时间的人,现在来写这篇东西确实是尴尬的,就像很多大神们说的,vim是世界上最好用的编辑器,没有之一.然后前两天又重新看了看vim的那些功能和使用方法,更觉得这么长时间使用vim却 ...

  6. Qt之设置窗口背景

    以前遇到的很多小知识,从今天开始都一点一点记录下来...     窗口背景无非两种:背景色.背景图片.Qt中窗口背景如何设置?下面介绍三种方法: 一. QPalette设置背景 二.实现paintEv ...

  7. 圆形Camera预览实现

    需求 最近有个需求要求界面上使用圆形相机预览进行面部检测 , 具体需求如下图 关于Camera之前接触得比较多 , 主要就是通过SurfaceView显示预览视图 , 因此需要展示圆形预览界面, 只需 ...

  8. mysqladmin: connect to server at 'localhost' failed

    1:mysqladmin: connect to server at 'localhost' failed 2: 3: 4:

  9. oracle 建表时显示ORA-00984: 列在此处不允许

      oracle 建表时显示ORA-00984: 列在此处不允许 CreationTime--2018年7月19日16点10分 Author:Marydon 1.情景展示 使用plsql建表时,报错 ...

  10. CentOS 6.4 配置DNS

    vi /etc/resolv.conf 写入以下内容并保存: nameserver x.x.x.x 重启服务以生效: service network restart