在linux C中,消息队列可以通过key来创建,在使用某个队列时,可根据key来获取队列,进而进行数据的收发;且队列的前4个字节,可用于判断目标进程,不匹配则不接收,也就是多个进程可共用一个队列进行消息的收发。
在python中则不同,没有key,直接get接收。这就要求每个队列对应一个进程。可对queues.Queue进行一次继承,添加需要的一些信息,再创建自己的队列;为使用方便,可为每个队列写一个收发函数。
from multiprocessing import queues
class VQueue(queues.Queue):
"""添加类说明"""
def __init__(self, qid, name, size, ctx):
"""
定制自己的消息队列
:param qid: 队列ID
:param name: 队列名称
:param size: 队列大小
:param ctx: 上下文
"""
super().__init__(maxsize=size, ctx=ctx)
if not isinstance(qid, int):
raise TypeError('Process id must be int type')
if not isinstance(name, str):
raise TypeError('Process name must be str type')
self.qid = qid
self.name = name
def __str__(self):
"""返回进程名字"""
return self.name
import multiprocessing
from vv_lib.vv_queue.vqueue import VQueue
# 队列编号、名称、大小
queue_def = ((1, 'college queue', 20),
(2, 'student queue', 20))
class MyQueues():
def __init__(self):
self.queues = []
context = multiprocessing.get_context('spawn')
for q in queue_def:
self.queues.append(VQueue(q[0], q[1], q[2], context))
# 每添加一个队列,添加一对send、recv方法
# 向队列发送消息
def ipc_snd_to_college(self, data):
self.queues[0].put(data)
# 从队列接收消息
def ipc_rcv_from_college(self):
return self.queues[0].get()
# 向队列发送消息
def ipc_snd_to_student(self, data):
self.queues[1].put(data)
# 从队列接收消息
def ipc_rcv_from_student(self):
return self.queues[1].get()
class MyGlobal():
def __init__(self):
self.queues = MyQueues()