gpt4 book ai didi

sockets - zmq轮询器如何工作?

转载 作者:行者123 更新时间:2023-12-02 02:21:33 25 4
gpt4 key购买 nike

我对 poller 在 zmq 中实际执行的操作感到困惑。 zguide 对其进行了最少的介绍,仅将其描述为一种从多个套接字读取的方法。这对我来说不是一个令人满意的答案,因为它没有解释如何拥有超时套接字。我知道zeromq: how to prevent infinite wait?解释了推/拉,但没有解释请求/代表模式,这是我想知道如何使用的。

我想问的是:轮询器如何工作,以及它的功能如何应用于跟踪套接字及其请求?

最佳答案

当您需要在同一线程中监听不同的套接字时,请使用轮询器:

ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB)
ZMQ.Socket puller = ctx.socket(ZMQ.PULL)

使用轮询器注册套接字(POLLIN 监听传入消息)

ZMQ.Poller poller = ZMQ.Poller(2)
poller.register(subscriber, ZMQ.Poller.POLLIN)
poller.register(puller, ZMQ.Poller.POLLIN)

轮询时,使用循环:

while( notInterrupted()){
poller.poll()

//subscriber registered at index '0'
if( poller.pollin(0))
subscriber.recv(ZMQ.DONTWAIT)

//puller registered at index '1'
if( poller.pollin(1))
puller.recv( ZMQ.DONTWAIT)
}

选择您想要的投票方式...

poller.poll() 会阻塞,直到任一套接字上有数据为止。
poller.poll(1000) 阻塞 1 秒,然后超时。

轮询器会在套接字上有可用数据(消息)时发出通知;阅读它是你的工作。

读取时,不要阻塞:socket.recv(ZMQ.DONTWAIT)。即使 poller.pollin(0) 检查是否有数据要读取,您还是希望避免轮询循环内的任何阻塞调用,否则,您最终可能会由于“卡住”套接字而阻塞轮询器.

因此,如果两条单独的消息发送到订阅者,则必须调用subscriber.recv()两次才能清除轮询器,否则,如果您调用subscriber.recv()一次,轮询器将不断告诉您还有另一条消息要读取。因此,本质上,轮询器跟踪消息的可用性和数量,而不是实际的消息。

您应该运行轮询示例并使用代码,这是最好的学习方式。

这能回答你的问题吗?

关于sockets - zmq轮询器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18114343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com