python多进程通信之消息队列

在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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值