当前位置:首页>python>Python开发从零开始-47.4-多进程和多线程

Python开发从零开始-47.4-多进程和多线程

  • 2026-10-17 16:21:55
Python开发从零开始-47.4-多进程和多线程

接上文Python开发从零开始-47.3-多进程和多线程,本文小编与大家分享 Python 多进程和多线程的相关知识。

2)使用 Pipe 进行进程间通信

管道提供了一种双向的通信方式,可以用于父进程和子进程之间的通信。可以使用 multiprocessing.Pipe() 函数创建一对 ‌PipeConnection 对象,代表管道的两端。这两个对象的方法完全一致,常用方法如下:

  • send()‌:发送一个可序列化的 Python 对象到管道另一端。若序列化数据超过 32MB 可能抛出 ValueError;

  • ‌recv()‌:用于接收数据,它会阻塞,直到接收到数据。若对端已关闭连接且无数据,抛出 EOFError;

  • close()‌:关闭连接。关闭后该端不能再收发数据,建议进程退出前显式调用以释放资源;

  • ‌poll([timeout])‌:非阻塞检查是否有数据可读。返回 True 表示有数据,False 表示无数据。timeout 为等待秒数,默认立即返回;

  • ‌fileno()‌:返回连接底层的整数文件描述符,用于底层 I/O 操作;

  • send_bytes(buffer[, offset[, size]])‌:发送字节数据,适用于高性能场景。未指定偏移和长度时发送全部 buffer;

  • ‌recv_bytes([maxlength])‌:接收字节数据,返回 bytes 对象,适用于高性能场景。maxlength 限制最大接收字节数,超限抛 IOError;

  • ‌recv_bytes_into(buffer[, offset])‌:将接收的字节直接写入提供的 buffer(如 bytearray),返回实际读取的字节数 ,适用于高性能场景。‌‌

使用 Pipe 进行进程间通信的代码示例如下:

import multiprocessingdef worker(conn):    while True:        command = conn.recv()  # 接收数据        if command == 'STOP':  # 如果接收到 STOP 命令,则停止工作            break        result = command * command  # 处理数据        conn.send(result)  # 发送结果回父进程if __name__ == '__main__':    parent_conn, child_conn = multiprocessing.Pipe()    proc = multiprocessing.Process(target=worker, args=(child_conn,))    proc.start()    # 发送数据到子进程并接收结果    for i in range(4):        parent_conn.send(i)  # 发送数据到子进程        print(parent_conn.recv())  # 从子线程接收信息并打印输出    parent_conn.send('STOP')  # 发送停止信号到子进程    proc.join()  # 等待进程结束

程序运行输出如下:

>>> %Run process_7.py0149>>> 

【小编提示】

队列(Queue)‌:适用于单向或双向的异步通信,适合于生产者-消费者模型。

‌管道(Pipe)‌:适用于需要双向通信的情况,可用于父子进程之间的通信。

在 Windows 操作系统中,如果代码使用了 multiprocessing 模块,并且想要在 IDE(如 PyCharm)中运行该代码,需要确保该代码脚本不是以主模块的形式运行。通常,使用 __name__ == '__main__' 来进行检查,这是因为 Windows 操作系统不支持从非脚本文件(如模块)中直接启动子进程。例如,如果使用了 multiprocessing 模块的代码在一个名为 my_module.py 的模块中,应该从另一个脚本中导入 my_module.py 并运行它。

受文章篇幅所限,下文将继续介绍 Python 多进程和多线程的相关知识。

最新文章

随机文章