Py学习  »  Python

Python入门:第 9 章 进程间通信

Python知识驿站 • 1 月前 • 84 次点击  

在现代分布式系统中,进程间的高效通信是保证系统性能和可靠性的关键环节。Python提供了一系列模块和库来支持多种通信机制,如共享内存、FIFO队列、消息队列等,满足不同的应用场景需求。

1、FIFO 队列(Pipe)

Pipe是一种简单的进程间通信方式,适用于需要低延迟且数据量不大的场景。使用multiprocessing.Pipe()函数可以轻松创建命名或匿名管道:

import multiprocessingdef proc(pipe):    while True:        message = pipe.recv()        if message == 'exit':            break        print(f'Process received:{message}')        if __name__ == '__main__':    src,des = multiprocessing.Pipe(duplex=True)    p = multiprocessing.Process(target=proc,args=(des,))    p.start()        for i in range(3):        msg = input('输入消息:')        src.send(msg)    src.send('bye')    src.close()    des.close()

上述代码实现了一个简单的双向通信管道,父进程可以向子进程发送消息,而子进程中接收到的数据会被打印出来。这种方式非常适用于需要频繁交互的任务执行。

2、共享内存(Shared Memory)

共享内存是一种高效的进程间数据交换方式,适用于大数据量的传输。通过multiprocessing.shared_memory.SharedMemory()可以创建和管理一块可被多个进程访问的内存区域:

import multiprocessingfrom multiprocessing import shared_memoryimport timedef process_two(shm_name):    shm = shared_memory.SharedMemory(name=shm_name)    shm.buf[0] = 42if __name__ == '__main__':    shm = shared_memory.SharedMemory(create=True,size=16)        process = multiprocessing.Process(target=process_two, args=(shm.name,))    process.start()        # 等待子进程修改数据    time.sleep(1)        print(shm.buf[0])    shm.close()

在这个例子中,父进程创建了一块共享内存区域,并启动一个子进程对该区域进行修改。之后,父进程中可以直接访问到被修改后的数据内容。

3、进程间的远程调用(RPC)

远程过程调用是一种更高级别的通信方式,可以方便地实现不同机器或同一机器上不同进程之间的函数调用。Python的标准库multiprocessing.rpc提供了一些基础的RPC功能,但实际应用中更多使用第三方库,如ZeroMQRabbitMQ等。

以下是一个使用 ZeroMQ 实现 RPC 的简单示例:

import zmqdef cumputer(request):    return request*3
def rpc_service ():    context = zmq.Context()    socket = context.socket(zmq.REP)    socket.bind("tcp://*:5555")
    while True:        request = socket.recv_json()        result = compute(request)         socket.send_json(result)
if __name__ == '__main__':    rpc_service()

客户端可以通过连接到指定的端口发送请求,服务端接收并处理这些请求:

import zmq
def rpc_client():    context = zmq.Context()    socket = context.socket(zmq.REQ)    socket.connect("tcp://localhost:5555")
    for _ in range(3):        request = input("Enter your request: ")        socket.send_json(request)        response = socket.recv_json()        print(f"Response: {response}")
if __name__ == '__main__':    rpc_client()
这种方式能够实现进程间甚至机器间的函数调用,适合构建分布式系统和微服务架构。
上面客户端和服务端启动后,在客户端输入测试结果如下:
使用哪种方式的进程间通信,取决于任务类型,如果有大量的分布式计算,一般都是采用RPC方式的消息队列。


延伸阅读:

    Python入门:第 1 章 Python 介绍

    Python入门:第 2 章 环境搭建与第一个程序

    Python入门:第 3 章 基本语法

    Python入门:第 4 章 数据结构

    Python入门:第 5 章 函数

    Python入门:第 6 章 类

    Python入门:第 7 章 文件读写

    Python入门:第 8 章 Python多进程

    自动化办公1——初识Pandas

    自动化办公2——Pandas数据结构

     自动化办公3——Pandas数据操作1

    自动化办公3——Pandas数据操作2

    自动化办公4——Pandas数据组合、连接与重构

    自动化办公5——Pandas数据透视表

    自动化办公6——Pandas数据分组1

    自动化办公6——Pandas数据分组2

    自动化办公7——Pandas画图

    数据可视化——matplotlib基础

    数据可视化——matplotlib进阶

    数据可视化——seaborn初识

    数据可视化——seaborn绘制关系图

    数据可视化——seaborn绘制分布图

    科学计算1——Numpy初识

    科学计算2——Numpy数组操作

    科学计算3——Numpy数组变形

    科学计算4——Numpy的索引与切片

    科学计算5——Numpy的基本计算

    科学计算6——Numpy的矩阵运算

    使用 NumPy 求解线性方程组:一个完整案例


更多内容请查看微信公众号。


---------知识需要分享,需要传播 ---------

这里是Python知识驿站,致力于知识传播,让更多人了解Python、使用Python、爱上Python。如果你是一名程序员、业余开发者、IT从业者,或者任何一名对Python感兴趣的人,都可以加入Python知识驿站,让我们一同畅享在知识的海洋中。


---------关注我,获得更多知识---------

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/183574
 
84 次点击