在现代分布式系统中,进程间的高效通信是保证系统性能和可靠性的关键环节。Python提供了一系列模块和库来支持多种通信机制,如共享内存、FIFO队列、消息队列等,满足不同的应用场景需求。
1、FIFO 队列(Pipe)
Pipe是一种简单的进程间通信方式,适用于需要低延迟且数据量不大的场景。使用multiprocessing.Pipe()
函数可以轻松创建命名或匿名管道:
import multiprocessing
def proc(pipe):
while True:
message = pipe.recv()
if message == 'exit':
break
print(f'Process received:{message}')
if __name__ == '__main__':
src,des = multiprocessing.Pipe(duplex=True)
p = multiprocessing.Process(target=proc,args=(des,))
p.start()
for i in range(3):
msg = input('输入消息:')
src.send(msg)
src.send('bye')
src.close()
des.close()
上述代码实现了一个简单的双向通信管道,父进程可以向子进程发送消息,而子进程中接收到的数据会被打印出来。这种方式非常适用于需要频繁交互的任务执行。
2、共享内存(Shared Memory)
共享内存是一种高效的进程间数据交换方式,适用于大数据量的传输。通过multiprocessing.shared_memory.SharedMemory()
可以创建和管理一块可被多个进程访问的内存区域:
import multiprocessing
from multiprocessing import shared_memory
import time
def process_two(shm_name):
shm = shared_memory.SharedMemory(name=shm_name)
shm.buf[0] = 42
if __name__ == '__main__':
shm = shared_memory.SharedMemory(create=True,size=16)
process = multiprocessing.Process(target=process_two, args=(shm.name,))
process.start()
# 等待子进程修改数据
time.sleep(1)
print(shm.buf[0])
shm.close()
在这个例子中,父进程创建了一块共享内存区域,并启动一个子进程对该区域进行修改。之后,父进程中可以直接访问到被修改后的数据内容。
3、进程间的远程调用(RPC)
远程过程调用是一种更高级别的通信方式,可以方便地实现不同机器或同一机器上不同进程之间的函数调用。Python的标准库multiprocessing.rpc
提供了一些基础的RPC功能,但实际应用中更多使用第三方库,如ZeroMQ
、RabbitMQ
等。
以下是一个使用 ZeroMQ 实现 RPC 的简单示例:
import zmq
def cumputer(request):
return request*3
def rpc_service
():
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
request = socket.recv_json()
result = compute(request)
socket.send_json(result)
if __name__ == '__main__':
rpc_service()
客户端可以通过连接到指定的端口发送请求,服务端接收并处理这些请求:
import zmq
def rpc_client():
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
for _ in range(3):
request = input("Enter your request: ")
socket.send_json(request)
response = socket.recv_json()
print(f"Response: {response}")
if __name__ == '__main__':
rpc_client()
这种方式能够实现进程间甚至机器间的函数调用,适合构建分布式系统和微服务架构。上面客户端和服务端启动后,在客户端输入测试结果如下:使用哪种方式的进程间通信,取决于任务类型,如果有大量的分布式计算,一般都是采用RPC方式的消息队列。
延伸阅读:
Python入门:第 1 章 Python 介绍
Python入门:第 2 章 环境搭建与第一个程序
Python入门:第 3 章 基本语法
Python入门:第 4 章 数据结构
Python入门:第 5 章 函数
Python入门:第 6 章 类
Python入门:第 7 章 文件读写
Python入门:第 8 章 Python多进程
自动化办公1——初识Pandas
自动化办公2——Pandas数据结构
自动化办公3——Pandas数据操作1
自动化办公3——Pandas数据操作2
自动化办公4——Pandas数据组合、连接与重构
自动化办公5——Pandas数据透视表
自动化办公6——Pandas数据分组1
自动化办公6——Pandas数据分组2
自动化办公7——Pandas画图
数据可视化——matplotlib基础
数据可视化——matplotlib进阶
数据可视化——seaborn初识
数据可视化——seaborn绘制关系图
数据可视化——seaborn绘制分布图
科学计算1——Numpy初识
科学计算2——Numpy数组操作
科学计算3——Numpy数组变形
科学计算4——Numpy的索引与切片
科学计算5——Numpy的基本计算
科学计算6——Numpy的矩阵运算
使用 NumPy 求解线性方程组:一个完整案例
更多内容请查看微信公众号。
---------知识需要分享,需要传播
---------
这里是Python知识驿站,致力于知识传播,让更多人了解Python、使用Python、爱上Python。如果你是一名程序员、业余开发者、IT从业者,或者任何一名对Python感兴趣的人,都可以加入Python知识驿站,让我们一同畅享在知识的海洋中。
---------关注我,获得更多知识---------