在Python中,进程间通信(IPC)可以通过多种方式实现,以下是几种常见的方法:
管道(Pipe)
管道是一种单向通信机制,可以在父进程和子进程之间创建一个管道,实现它们之间的进程间通信。
from multiprocessing import Process, Pipe
def sender(conn):
conn.send('Hello from sender!')
conn.close()
def receiver(conn):
msg = conn.recv()
print('Received message:', msg)
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p1 = Process(target=sender, args=(parent_conn,))
p2 = Process(target=receiver, args=(child_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
共享内存(Shared Memory)
共享内存允许两个或多个进程访问同一块内存区域,通过这种方式,进程可以像操作本地内存一样操作共享内存中的数据。
from multiprocessing import Value, Array
def worker(num, arr):
for i in range(len(arr)):
arr[i] = num * 2
if __name__ == '__main__':
num = 5
arr = Array('i', 10)
p = Process(target=worker, args=(num, arr))
p.start()
p.join()
print(arr[:]) 输出: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
消息队列(Message Queue)
消息队列允许进程将消息放入队列中,其他进程可以从队列中取出消息。`multiprocessing.Queue`是Python中实现消息队列的类。
from multiprocessing import Process, Queue
def producer(queue):
queue.put('A')
time.sleep(2)
def consumer(queue):
data = queue.get()
print(data)
if __name__ == '__main__':
queue = Queue(10)
p = Process(target=producer, args=(queue,))
c = Process(target=consumer, args=(queue,))
p.start()
c.start()
p.join()
c.join()
其他方法
`apply_async()`:非阻塞式通讯
`apply()`:阻塞式通讯
`Value`和`Array`:共享内存的一种IPC方式
选择哪种通信方式取决于你的具体需求,例如是否需要阻塞、是否需要跨网络通信等。`multiprocessing.Queue`因其简单易用,通常是实现进程间通信的首选方法