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]

相关文章
|
10月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1374 14
|
4月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
9月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
466 0
|
11月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
302 1
抓取和分析JSON数据:使用Python构建数据处理管道
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
662 1
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
178 0

热门文章

最新文章

推荐镜像

更多