进程间通信(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. C++ Jsoncpp源代码编译与解析Json

    1.Json 数据表示方式介绍 这个可以看之前的一个文章里面有说明:Java解析(读取)Json数据 2.C++ Jsoncpp 2.1 Jsoncpp介绍 (1)JsonCpp主要包含三种类型的cl ...

  2. HDU2669 Romantic 扩展欧几里德 对我来说有陷阱

    这道题对我来说有陷阱虽说是赤果果的扩展欧几里德,看样子基本攻还是不够哈,基本功夫一定要好,准备每天上那种洗脑课时分  多看看数论书,弥补一下 自己 狗一样的基础, 这道题用到了一个性质: 对于不定整数 ...

  3. Word Break leetcode java

    题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-se ...

  4. Merge Two Sorted Lists leetcode java

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...

  5. Android下 使用百度地图sdk

    百度地图 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系统)及以上版本设备的应用程序接口.可以使用该套 SDK开发适用于Android系 ...

  6. ItemsControl

    <ItemsControl Grid.Row=" ItemsSource="{Binding Content.patientInfoList}" Width=&qu ...

  7. python 两个队列进行对比

    python 两个队列进行对比 list01 = [1,2,3,4] list02 = [1,3,5] for i01 in list01: is_in_02 = False for i02 in l ...

  8. Effective C++ 条款27

    尽量少做转型动作 尽量少做转型动作有什么目的?非常明显无非就是提高程序的稳定性.提高程序的运行效率. 那么.有哪些转型方式?每种方式都有什么弱点? 这是我们本节学习的重点. C++有四种转型: con ...

  9. 【leetcode 桶排序】Maximum Gap

    1.题目 Given an unsorted array, find the maximum difference between the successive elements in its sor ...

  10. (LeetCode 41)First Missing Positive

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...