国际访客建议访问 Primers 编程伙伴 国际服 以获得更好的体验。 快速访问 Python 进程控制 进程间通信

# Python 的进程间通信

进程的内存空间和资源是独立的,尝试通过全局变量传递信息会发现无法实现。

例如下面代码,子进程会打印空字符串而不是 Ciallo~(∠・ω< )⌒★

from multiprocessing import Process

message:str = ''

def worker():
    print(message)

if __name__ == '__main__':
    message = 'Ciallo~(∠・ω< )⌒★'      # 尝试发送信息              
    p = Process(target=worker)          # 创建进程
    p.start()                           # 启动进程
    p.join()                            # 等待进程结束

在 Python 中可以使用 队列(Queue)管道(Pipe) 进行进程间通信(IPC)。

# 队列

通过 multiprocessing 模块的 Queue 类创建队列,通过 put 方法向队列尾部添加数据,通过 get 方法从队列头部取出数据。

digraph QueueTopology {
    node [shape=record fontname="Arial"];

    queue [label="<f0> Head | <f1> A | <f2> B | <f3> C | <f4> D | <f5> Tail"];

    queue:f0 -> "get()";
    "put()" -> queue:f5;
}

示例:

from multiprocessing import Process, Queue

# 生产者,发送数据
def producer(q:Queue):
    for i in range(5):
        q.put(i)                                # 发送数据
    q.put(None)                                 # 发送 None 来表示结束

# 消费者,接收数据
def consumer(q:Queue):
    while (item := q.get()) is not None:
        print(f'收到了 {item}')

if __name__ == '__main__':
    q = Queue()                                 # 创建队列
    p1 = Process(target=producer, args=(q,))    # 创建进程
    p2 = Process(target=consumer, args=(q,))
    p1.start()                                  # 启动进程
    p2.start()
    p1.join()                                   # 等待进程退出
    p2.join()

运行结果:

收到了 0
收到了 1
收到了 2
收到了 3
收到了 4

# 管道

通过 multiprocessing 模块的 Pipe 函数创建管道,它会返回管道的两个端点,从任意一端写入时另一端可以读取。

digraph PipeStructure {
    rankdir=LR;
    node [shape=record fontname="Arial"];

    end1 [label="端点1", shape=box];
    buffer [label="{ 缓冲区 }", shape=record];
    end2 [label="端点2", shape=box];

    end1 -> buffer [label="send()", color="green"];
    buffer -> end2 [label="recv()", color="green"];

    end1 -> buffer [style=invis];
    buffer -> end2 [style=invis];

    end2 -> buffer [label="send()", color="purple"];
    buffer -> end1 [label="recv()", color="purple"];
}

示例:

from multiprocessing import Process, Pipe
from multiprocessing.connection import PipeConnection

# 生产者,发送数据
def producer(tx:PipeConnection):
    for i in range(5):
        tx.send(i)                              # 发送数据
    tx.send(None)                               # 发送 None 来表示结束

# 消费者,接收数据
def consumer(rx:PipeConnection):
    while (item := rx.recv()) is not None:
        print(f'收到了 {item}')

if __name__ == '__main__':
    tx, rx = Pipe()                             # 创建管道
    p1 = Process(target=producer, args=(tx,))   # 创建进程
    p2 = Process(target=consumer, args=(rx,))
    p1.start()                                  # 启动进程
    p2.start()
    p1.join()                                   # 等待进程退出
    p2.join()

运行结果:

收到了 0
收到了 1
收到了 2
收到了 3
收到了 4
本文 更新于: 2025-05-31 19:53:12 创建于: 2025-05-31 19:53:12