这顿不吃行不行 2024-03-08 16:26 采纳率: 0%
浏览 7

python怎么操作消息队列

Linux环境下,有一个C++程序和一个python程序,指定用消息队列实现进程间的通信,c++程序的消息队列用的System V实现,python程序怎么从C++创建的消息队列中拿到消息?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 16:27
    关注

    引自免费微信小程序:皆我百晓生

    在Linux环境下,C++程序使用System V消息队列创建了一个消息队列后,Python程序可以通过相应的接口来访问和操作这个消息队列以获取消息。在Python中,我们可以利用第三方库python-mq(或sysv_ipc)来实现对System V消息队列的支持。

    以下是一个简化的示例,展示如何在Python中从C++创建的消息队列中接收消息:

    首先,请确保你已经安装了sysv_ipc库,如果没有安装,可以通过pip进行安装:

    pip install sysv_ipc
    

    然后,在Python程序中,你可以这样做:

    import sysv_ipc
    
    # 获取C++程序创建的消息队列的键(key)
    key = 12345  # 假设这是你们约定好的消息队列标识符
    
    # 尝试连接到已存在的消息队列
    try:
        mq = sysv_ipc.MessageQueue(key, flags=sysv_ipc.IPC_RMID)  # 如果不存在会抛出异常
    except sysv_ipc.ExistentialError:
        mq = sysv_ipc.MessageQueue(key)
    
    # 设置缓冲区大小,根据C++程序实际发送的消息大小调整
    buf_size = 1024
    
    # 读取消息
    while True:
        try:
            message, priority = mq.receive(buf_size)
            print("Received message:", message.decode('utf-8'))
        except sysv_ipc.BusyError:
            # 消息队列无消息时可能抛出此异常,可以根据需要处理
            pass
        except Exception as e:
            print(f"An error occurred: {e}")
            break
    
    # 完成后关闭消息队列
    mq.remove()
    

    请注意,上述代码片段假设C++程序已经成功创建了一个System V消息队列,并且Python程序知道其对应的键值。在实际应用中,还需要处理各种可能出现的错误情况以及合理设置消息队列的相关参数。

    另外,C++端创建消息队列的代码通常如下:

    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    
    // 创建一个消息队列,返回队列id
    int msg_id = msgget(KEY, IPC_CREAT | 0600); // KEY为整型常量,作为消息队列的键值
    
    // 构造消息结构体并发送消息...
    

    这样,Python程序就能与C++程序通过System V消息队列进行通信了。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月8日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度