当前位置: 首页 > 面试题库 >

zeromq:如何防止无限等待?

蒋何平
2023-03-14
问题内容

我刚开始使用ZMQ。我正在设计一个工作流程为:

  1. 5555(具有随机PULL地址)的多个客户端之一向服务器推送请求
  2. 服务器永远等待客户端推送。当一个请求到达时,将为该特定请求生成一个工作进程。是的,工作进程可以同时存在。
  3. 该流程完成任务后,会将结果推送给客户端。

我认为PUSH / PULL体系结构适合于此。请对此进行 指正

但是,如何处理这些情况?

  1. 服务器无法响应时,client_receiver.recv()将无限期等待。
  2. 客户端可以发送请求,但是此请求将立即失败,因此工作进程将永远停留在server_sender.send()处。

那么如何在PUSH / PULL模型中设置 超时 等内容?

编辑 :感谢user938949的建议,我得到了一个 有效的答案 ,我在后人中分享。


问题答案:

如果使用zeromq> = 3.0,则可以设置RCVTIMEO套接字选项:

client_receiver.RCVTIMEO = 1000 # in milliseconds

但通常,您可以使用轮询器:

poller = zmq.Poller()
poller.register(client_receiver, zmq.POLLIN) # POLLIN for recv, POLLOUT for send

poller.poll()超时:

evts = poller.poll(1000) # wait *up to* one second for a message to arrive.

evts 如果什么也收不到,将是一个空列表。

您可以使用轮询zmq.POLLOUT,以检查发送是否成功。

或者,要处理可能失败的对等方,请执行以下操作:

worker.send(msg, zmq.NOBLOCK)

可能就足够了,它将始终立即返回-如果发送无法完成,则引发ZMQError(zmq.EAGAIN)。



 类似资料:
  • 我刚刚意识到,当只有一个消费群体存在时,XACK不会自动删除消息。 我以为当所有的消费者组都收到相同的消息时,消息会被Redis-server删除,但似乎不是这样。 因此,Redis流内存无限增加,因为没有消息会被删除。 也许防止这种情况的唯一方法是手动发送XDEL消息?但我怎么知道所有的消费者群体都接受了这个信息呢? 需要一些帮助,谢谢!

  • 问题内容: 我有这样的代码: 我的问题是,节点在运行时立即终止。它显示“ Icanhasclient”,但没有调用回调内的console.log。 (本例中的mysql是node- mysql 。 有什么办法可以使node.js在退出之前等待回调完成? 问题答案: 回调未排队 节点运行直到所有事件 队列 都为空。诸如以下的调用时,回调将添加到事件 队列 中 已执行。该调用是模块开发人员编写的代码的

  • 我有一个cron,它正在使用fwrite函数,在cron运行1小时后,它将崩溃并出现错误: fwrite():发送29字节失败,对等方重置了errno=104连接 在线: 在这之后,我总是通过 似乎PHP内核和DNS解析器内部有问题,因为在这之后,我在将主机名解析到ip地址时遇到了一些问题。在我的函数中,还使用了和函数。如何预防这些问题?

  • 有没有更好的写法呢?由于某种原因,我真的需要这个循环吗?(似乎与有关)

  • 问题内容: 我的存储库每5分钟就会收到一次轮询。 但是我发现,如果jenkinsfile被完全破坏,则管道将失败,并显示“此阶段没有步骤”。 然后每5分钟它将重试一次并保持失败。 我该如何防范呢?我可以在某个地方设置阈值,以便这种情况不会永远消失吗? 问题答案: 如果使用的是scm轮询,则只有在发生更改时才应构建。听起来您可能正在按计划进行计划。这是声明性管道中每种语法的不同。 或者您可以做的是从

  • 我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky

  • 问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问

  • 问题内容: 我的侧边栏中有一个使用嵌套列表( 和 标记)的分层导航菜单。我使用的预制主题已经具有列表项的样式,但是我想更改顶级项的样式,但不能将其应用于子项。是否有一种简单的方法可以将样式应用于顶级列表项标签,​​而无需将样式层叠到其子级列表项?我知道我可以在子项目中显式添加重写样式,但是如果有一种简单的方法,只是说“将这些样式应用于此类并且不要级联,我真的很想避免必须重复所有样式代码”他们将其归