社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python知识驿站 • 3 月前 • 129 次点击  

在现代分布式系统中,进程间的高效通信是保证系统性能和可靠性的关键环节。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
 
129 次点击