接上文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 命令,则停止工作breakresult = 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 多进程和多线程的相关知识。