在Python中实现多进程间的通信主要包含共享内存、管道(pipe)、队列(queue)、消息队列(message queue,如Queue模块、multiprocessing.Queue或redis、rabbitmq等)以及数据 sockets。以下详细解析这五种常用方法。
1. 共享内存
共享内存实现不同进程间的直接访问同一块物理内存区域。使用multiprocessing.Value和multiprocessing.Array创建共享内存对象。
示例代码:初始化一个整型共享变量,并在多个进程中修改其值。
python
import multiprocessing
shared_var = multiprocessing.Value('i', 5)
def worker(): with shared_var.get_lock(): print(f"Worker: {shared_var.value}") shared_var.value += 1
if __name__ == 'main': p = multiprocessing.Process(target=worker) p.start() p.join()
注意,在多个进程修改共享内存时需使用锁确保线程安全。
2. 管道(Pipe)
管道支持半双工通信,允许多进程间单向传递数据。创建管道后,每个连接有读端和写端。
示例代码:创建管道,父进程向子进程发送信息。
python
import multiprocessing
def writer(pipe): pipe.send("Hello from writer") pipe.close()
def reader(pipe): message = pipe.recv() print(f"Received: {message}") pipe.close()
if __name__ == 'main': parent_conn, child_conn = multiprocessing.Pipe() # 创建管道 p = multiprocessing.Process(target=writer, args=(child_conn,)) r = multiprocessing.Process(target=reader, args=(parent_conn,))
父进程向子进程发送信息后关闭管道,子进程接收并打印信息。
3. 队列(Queue)
队列提供线程安全的数据存储与交换。使用multiprocessing.Queue创建可由多个进程共享的队列。
示例代码:在生产者和消费者进程间传输数据。
python
import multiprocessing
def producer(queue): for i in range(5): queue.put(i) print(f"Produced: {i}")
def consumer(queue): while True: item = queue.get() if item is None: break print(f"Consumed: {item}")
if __name__ == 'main': queue = multiprocessing.Queue() p = multiprocessing.Process(target=producer, args=(queue,)) c = multiprocessing.Process(target=consumer, args=(queue,))
生产者将数字放入队列,消费者取出并消费数据。
4. 消息队列(Message Queue)
标准库的Queue模块提供简单消息队列功能。大型项目中,常使用外部服务如RabbitMQ或Redis作为消息队列系统。
示例代码:使用pika库操作RabbitMQ。
首先安装pika库:bash pip install pika
示例代码:启动消费者监听队列并接收消息。
python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body): print(" [x] Received %r" % body)
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()
主程序启动消费者监听队列,接收并打印消息。
5. 数据 sockets
使用Python的socket模块实现多进程间通信。此方法支持复杂数据传输。
示例代码:服务器端创建socket,等待客户端连接并接收数据。
python
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen(5)
while True:
conn, addr = server_socket.accept()
data = conn.recv(1024)
print(f"Received: {data.decode()}")
conn.close()
总结,Python提供多种多进程通信方法,开发者应根据实际需求选择合适的通信方式以实现高效且可靠的进程间通信。确保同步与线程安全至关重要。