Skip to main content

os

Multi_processing

在 Python 中,mp.Processmultiprocessing 模块中的一个类,用于创建并启动一个新的进程,以便实现多进程并行计算。mp.Process 的返回是一个 Process 对象,该对象可以用来控制和管理新启动的进程,比如启动、终止、等待进程结束等操作。

mp.Process 返回的 Process 对象

这个对象包含以下关键属性和方法:

  • start(): 启动进程的执行。
  • join(): 等待进程结束。
  • terminate(): 终止进程。
  • is_alive(): 检查进程是否还在运行。
  • pid: 获取进程的进程 ID。

通过 mp.Process 创建和管理的进程可以运行独立的代码块,通常用来执行计算密集型任务或处理并发 I/O 操作。

pipe 通信

multiprocessing 模块中的 Pipe 提供了一种简单的进程间通信(IPC)方式,它创建一个双向通信的连接点,允许两个进程通过 send()recv() 方法发送和接收消息。这种通信方式仅适用于单机上的 Python 进程之间,适合进程间的小规模通信和数据传递。

相比之下,MPI(Message Passing Interface) 是一个标准化、专门用于分布式系统上进程间通信的接口,常用于高性能计算(HPC)集群。MPI 允许进程在不同计算节点之间进行复杂的消息传递,支持大规模的分布式计算环境。

MPI (Message Passing Interface) 是一个标准化的编程接口,用于在分布式计算环境中实现进程间通信,主要用于高性能计算(HPC)。MPI 提供了一组 API 函数,允许程序在多台计算机或多个计算节点上分布式运行时,实现数据的高效传递和协同处理。常见的 MPI 实现包括 MPICHOpen MPI

MPI

  • 进程间通信:MPI 专为分布式系统中的多进程设计,各进程通常分布在不同的节点(计算机)上,通过网络连接进行通信。
  • 点对点通信(Point-to-Point Communication):两个进程之间的直接消息传递。比如,sendrecv 操作。
  • 集合通信(Collective Communication):多个进程之间的同步通信操作,如广播(broadcast)、聚合(gather)、散播(scatter)等。
  • 进程组和通信器:进程可以分组或分配给不同的通信器,以便不同的组或通信域内的进程能同时参与不同的计算任务。

常用功能

  1. 初始化和终止:程序启动时调用 MPI_Init 初始化 MPI 环境,结束时用 MPI_Finalize 关闭 MPI。
  2. 进程标识和分组
    • 每个进程在启动时都会得到一个唯一的标识符(rank),用于标识它在 MPI 环境中的位置。
    • MPI_Comm_size 用于获取总进程数,MPI_Comm_rank 用于获取当前进程的 rank。
  3. 消息传递
    • 点对点通信:如 MPI_SendMPI_Recv,用于两个进程之间的直接通信。
    • 集合通信:如 MPI_Bcast(广播)、MPI_Reduce(规约)、MPI_Scatter(分散)、MPI_Gather(聚合)等,用于一对多或多对一的通信操作。
  4. 数据同步:MPI 提供多种同步机制,确保分布式环境中数据的一致性。

rank_id

在 MPI 中,rank 是每个进程在通信组(通常是 MPI_COMM_WORLD)中的唯一标识符。它是一个整数,表示该进程在整个进程组中的位置。通过 rank,进程可以知道自己在集群中的身份,从而在分布式任务中执行不同的操作或决定通信的目标进程。

Python

在 Python 中,MPI 的常见实现有以下几种,它们为 Python 提供了访问 MPI 功能的接口,使得 Python 程序能够在分布式计算环境中实现高效的进程间通信:

  • 介绍mpi4py 是最广泛使用的 Python MPI 实现,它基于 C 标准库 MPI 的 Python 绑定,提供了简单且强大的 API。

  • 安装:可以使用 pip install mpi4py 安装。

  • 特点

    • 提供了对 MPI 的点对点通信(send/recv)和集合通信(broadcast、gather、scatter 等)的支持。
    • 支持 NumPy 数据类型的直接通信,适合科学计算。
    • 能很好地与现有的 MPI 实现(如 Open MPI、MPICH)集成。
  • 使用示例

    python


    Copy code
    from mpi4py import MPI

    comm = MPI.COMM_WORLD # 定义通信器
    rank = comm.Get_rank() # 获取进程 rank
    size = comm.Get_size() # 获取进程总数

    if rank == 0:
    data = {'key1': [1, 2, 3], 'key2': ('abc', 'xyz')}
    comm.send(data, dest=1) # rank 0 发送数据到 rank 1
    elif rank == 1:
    data = comm.recv(source=0) # rank 1 接收来自 rank 0 的数据
    print("Received data:", data)

rpyc

rpyc 是一个用于 Python 远程过程调用(Remote Procedure Call, RPC) 的库,全称为 Remote Python Call。它允许一个 Python 进程远程调用另一个 Python 进程中的函数或访问变量,就像在本地调用一样。这对于分布式系统、远程服务器控制、跨进程通信等非常有用。

与其他 RPC 框架(如 gRPC)相比,它仅适用于 Python 进程间通信,不能跨语言使用。