Python中使用multiprocessing.connection模块进行多进程之间的IPC通信
发布时间:2023-12-27 06:54:54
Python的multiprocessing模块提供了一种通过进程之间的IPC(进程间通信)进行通信的方法。其中,multiprocessing.connection模块提供了两种常用的IPC通信方式:Pipe和Listener/Client。
1. 使用Pipe进行IPC通信
Pipe方法返回两个连接对象,可以分别用于进程之间的读和写操作。其中一个连接对象用于父进程,另一个用于子进程。
from multiprocessing import Process, Pipe
def send(conn):
conn.send('Hello, child process!')
conn.close()
def receive(conn):
message = conn.recv()
print('Received:', message)
conn.close()
parent_conn, child_conn = Pipe()
p1 = Process(target=send, args=(parent_conn,))
p2 = Process(target=receive, args=(child_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
在上面的例子中,首先通过Pipe方法创建了两个连接对象parent_conn和child_conn。然后创建了两个子进程p1和p2,分别传入各自的连接对象。在 个子进程p1中,通过send方法发送消息给子进程。在第二个子进程p2中,通过recv方法接收消息,并进行打印输出。
2. 使用Listener/Client进行IPC通信
Listener/Client通信方式中,一个进程作为服务器端创建Listener对象,另一个进程作为客户端创建Client对象,并通过这两个对象进行通信。
from multiprocessing import Process, Listener, Client
def server(listener):
conn = listener.accept()
print('Connection accepted from', listener.last_accepted)
conn.send('Hello, client!')
conn.close()
def client(address):
conn = Client(address)
message = conn.recv()
print('Received:', message)
conn.close()
listener = Listener()
address = listener.address
p1 = Process(target=server, args=(listener,))
p2 = Process(target=client, args=(address,))
p1.start()
p2.start()
p1.join()
p2.join()
在上面的例子中,首先创建了一个Listener对象listener,并通过该对象获取了IPC通信的地址。然后创建了两个子进程p1和p2,分别传入listener和address。在 个子进程p1中,通过accept方法等待客户端的连接,并发送消息给客户端。在第二个子进程p2中,通过Client方法连接到服务器端,并通过recv方法接收消息。
通过multiprocessing.connection模块提供的方法,我们可以方便地在多进程之间进行IPC通信,实现进程之间的数据共享和通信。这种方法在一些需要并发处理的场景中非常有用,如爬虫、数据处理等。
