【问题标题】:ZeroMq PUSH/PULL ensure that PUSH queue is emptyZeroMq PUSH/PULL 确保 PUSH 队列为空
【发布时间】:2020-02-21 15:00:06
【问题描述】:

我有一个包含 2 个模块(一个在 C++ 中,一个在 Python 中)的架构,它们通过 ZeroMQ 与 PUSH/PULL 套接字进行通信。PUSHER 是 C++ 模块,而 PULLER 是 Python 模块。第三个模块在 REQ/REP 中与这两个模块通信以请求特定命令(例如启动、停止、终止……)。

我的 Python 模块可以在 3 种不同的模式下启动,并且可以在通过 REQ/REP 请求时在它们之间切换。在模式之间切换时,两个 C++ 和 python 模块都会停止(进入空闲状态),然后再次启动。 C++ 只有一种模式,但它会进入 IDLE_STATE,因为否则它会一无所获并继续填充其发送队列。

但问题是python模块首先收到停止请求,然后是C++模块。因此,C++ 模块在停止之前有时间继续填充其队列。因此,当以另一种模式再次启动时,python 模块会先从前一种模式获取消息,然后再从实际模式获取消息。

那么,有没有办法避免这种行为?我正在考虑在 python 模块中创建一个“clearQueue”函数,以便它在启动 C++ 模块之前接收剩余的消息(并将它们扔到垃圾箱)。

【问题讨论】:

    标签: zeromq pyzmq


    【解决方案1】:

    我做了更多的研究试图找到一个解决方案,但似乎没有简单的解决方案。 Hight Water 标记(即队列大小)可以设置为特定值,所以我正在考虑将其设置为 1,但它仍然可能会在队列中剩余一条消息。没人帮忙吗?

    编辑:我实际上在 python 端添加了以下内容,我发现非常糟糕。但无法获得其他解决方案。

    try:
        while True:
            self.bus.receiveData(zmq.NOBLOCK)
    except:
        pass
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 2013-12-14
      • 2022-01-07
      • 2013-07-22
      • 2020-05-20
      • 1970-01-01
      • 2016-10-25
      • 2022-12-27
      • 1970-01-01
      相关资源
      最近更新 更多