面试题答案
一键面试1. Python中管道(Pipe)进行进程间通信的原理
在Python中,multiprocessing
模块提供的Pipe
类用于进程间通信。管道是一种半双工的通信机制,它有两端,一端用于发送数据(send
),另一端用于接收数据(recv
)。
当创建一个管道时,系统会在内核空间中开辟一块缓冲区,进程通过管道对象的send
和recv
方法来对这块缓冲区进行读写操作。当一个进程向管道发送数据时,数据会被复制到内核缓冲区中;当另一个进程从管道接收数据时,数据从内核缓冲区复制到接收进程的用户空间。
2. 适合使用管道通信的实际应用场景
例如,在一个数据处理系统中,有一个数据生成进程和一个数据处理进程。数据生成进程不断生成数据,数据处理进程需要实时获取这些数据并进行处理。这种情况下就可以使用管道进行通信,数据生成进程将数据通过管道发送给数据处理进程。
3. 代码示例
import multiprocessing
def sender(conn):
data = [1, 2, 3, 4, 5]
for num in data:
conn.send(num)
print(f"发送数据: {num}")
conn.close()
def receiver(conn):
while True:
try:
data = conn.recv()
print(f"接收数据: {data}")
except EOFError:
break
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=sender, args=(parent_conn,))
p2 = multiprocessing.Process(target=receiver, args=(child_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
在上述代码中:
multiprocessing.Pipe()
创建了一个管道,返回两个连接对象parent_conn
和child_conn
。sender
函数负责向管道发送数据。receiver
函数负责从管道接收数据。- 在
if __name__ == '__main__':
块中,创建了两个进程,一个运行sender
函数,另一个运行receiver
函数,并启动和等待它们完成。