Python多进程消息队列实现进程间通讯

本文探讨了进程间通信(IPC)的各种方式,重点讲解了消息队列的概念和原理,并通过Python实例展示了如何在多进程中使用消息队列进行数据交换。消息队列遵循先进先出原则,允许多个进程有序地存储和检索信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 进程间的通讯

实现进程间的通讯(IPC)的方式有很多种,如:管道,消息队列,共享内存,信号,信号量,套接字

管道消息队列共享内存
开辟空间内存内存内存
读写方式两端读写[双向/单向]先进先出覆盖之前的内容
效率一般一般较高
应用多用于父子进程广泛灵活需要注意互斥

本文仅记录消息队列学习内容。

2. 消息队列

队列:先进先出,按照顺序来

通信原理:在内存中建立队列数据结构模型。多个进程都可以通过队列存入内容,取出内容的顺序和存入的顺序保持一致

3. 多进程消息队列Python实现

#!/usr/bin/env python3
# -*- coding:UTF-8 -*-
from multiprocessing import Process, Pipe
import time
import os
import pickle, gzip

def save(filename, *objects):
	#with open(filename, "wb", encoding="utf-8") as f:
	fil = None
	try:
		fil = gzip.open(filename,'wb')
		for obj in objects:
			pickle.dump(obj,fil)
	except Exception as e:
		print (e)
	finally:
		if fil:
			fil.close()

def load(filename):
	fil = None
	try:
		fil = gzip.open(filename, 'rb')
		return pickle.load(fil)
	except Exception as e:
		#print(e)
		return None
	finally:
		if fil:
			fil.close()

# 若将本地文件改为网络共享文件,则可实现分布式环境多进程消息队列模型
filename = "/tmp/test_msg.txt"

#多进程消息队列传递数据
from multiprocessing import Queue,Process
from time import sleep
import multiprocessing

# 创建队列,可以放3条消息
manager = multiprocessing.Manager()
q = manager.Queue(5)

def fun_product():
	sleep(1)
	while True:
		info = load(filename)
		if not info:
			info = {"aa":1, "bb":2 }
			print("_1_ create new info {}".format(info))
		else:
			print("_1_ product pre info {}".format(info))
			aa = info['aa']
			bb = info['bb']
			info['aa'] = aa+2
			info['bb'] = aa+3
			print("_1_ product post info {}".format(info))

		print("_1_ save info {}".format(info))
		save(filename, info)
		#q.put(info)
		sleep(3)

def fun_get():
	while True:
		sleep(2)
		info=load(filename)
		if info:
			#print("收到消息",q.__next__().get())
			#print("q not None, but not get from it.")
			print("_1_ load info", info)
		else:
			print("_1_ load info None")

p1 = Process(target = fun_product)
p2 = Process(target = fun_get)
# 生产者调用
p1.start()
p1.join()
# 消费者者调用
#p2.start()
#p2.join()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值