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]

相关文章
|
7天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
26天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
14天前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
19天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
43 1
|
26天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
1月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
31 3
|
2月前
|
机器学习/深度学习 Shell 开发工具
Python使用管道执行git命令报错|4-7
Python使用管道执行git命令报错|4-7
|
1月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
20 0
|
1月前
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信
|
2月前
|
数据采集 Linux 调度
Python之多线程与多进程
Python之多线程与多进程