【问题标题】:Cancel last sent message ZeroMQ (python) (dealer/router and pushh/pull)取消最后发送的消息 ZeroMQ (python) (dealer/router and pushh/pull)
【发布时间】:2022-08-19 14:39:12
【问题描述】:

如何取消最后发送的消息?

我有这个设置

这个想法是客户可以要求不同类型的大数据。 服务器从客户端读取请求并回答确认。 一旦它的数据准备好,它就会通过另一个套接字推送它。 当连接多个客户端时,这将启用服务器端的排队任务。 但是,如果客户端决定不再需要数据,它可以向服务器发送取消消息。

我正在使用 asyncio.Queue 对消息进行排队,因此我可以轻松清空队列,但是,我不知道如何删除推/拉管道中的消息以释放通道?

https://zguide.zeromq.org/docs/chapter2/ 中的终止开关示例(图 19 - 带有终止信号的并行管道)用于结束进程。我只是想取消它。

我的想法是关闭服务器端的套接字并重新打开它,但即使将 linger 设置为 0,消息也不会被丢弃。

编辑:消息确实被丢弃了,但我觉得解决方案是错误的。

    标签: zeromq pyzmq


    【解决方案1】:

    ZeroMQ 本身拥有这样的功能并没有任何意义。

    假设它确实具有取消消息​​功能。要使其按预期运行,您将严重依赖网络的速度。您可能在缓慢的网络上进行开发,并且您有时间决定取消、提交请求并在任何移动到任何地方之前使其生效。但在快速网络上,您不会。

    ZeroMQ 有点像邮局。一旦您发布了一封信,他们就会将其交付。

    问题在于 ZeroMQ 实现 Actor 模型,其中传输缓冲消息。您需要的是通信顺序进程,它不缓冲消息。您可以在 ZeroMQ 之上轻松实现这一点,基本上您需要做的就是进行两种方式的消息交换,基本上就像:

    • Peer1->Peer2:我想给你发消息
    • 时间流逝
    • Peer2->Peer1:好的,发送消息
    • Peer1->Peer2:这是消息
    • 时间流逝
    • Peer2->Peer1:我收到了消息
    • 结束

    在这样做的过程中,对等点会阻塞,即对等点 1 在得到对等点 2 的最终响应之前什么也不做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2023-02-09
      相关资源
      最近更新 更多