首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零q zmq.Poller & stdin

零q zmq.Poller & stdin
EN

Stack Overflow用户
提问于 2012-02-25 21:29:25
回答 2查看 1.9K关注 0票数 5

是否可以使用zmq.Poller来轮询stdin上的数据可用性?如果不是,在某个时候(理想情况下),在zeromq套接字和stdin上轮询数据的最有效等待是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-25 22:26:41

是的,zmq计票器确实支持本地do,包括stdin,等等,所以您只需要检查sys.stdin.fileno()

代码语言:javascript
复制
poller = zmq.Poller()
poller.register(sys.stdin, zmq.POLLIN)
poller.register(mysocket, zmq.POLLIN)
evts = dict(poller.poll(1000))
stdin_ready = evts.get(sys.stdin.fileno(), False)
socket_ready = evts.get(mysocket, False)
票数 4
EN

Stack Overflow用户

发布于 2013-12-27 20:50:16

如果您确信您永远不会在Windows上运行,您可以简单地将sys.stdin注册到zmq.Poller (作为described by minrk, above)。

但是,select() implementation in Winsock只支持套接字,不能用于轮询“常规”文件描述符(如标准输入)。因此,在Windows上运行时,需要将标准输入与inproc传输上的0MQ套接字连接起来。

建议使用独占对套接字实现:

代码语言:javascript
复制
def forward_lines(stream, socket):
    """Read lines from `stream` and send them over `socket`."""
    try:
        line = stream.readline()
        while line:
            socket.send(line[:-1])
            line = stream.readline()
        socket.send('')  # send "eof message".
    finally:
        # NOTE: `zmq.Context.term()` in the main thread will block until this
        #       socket is closed, so we can't run this function in daemon
        #       thread hoping that it will just close itself.
        socket.close()


def forward_standard_input(context):
    """Start a thread that will bridge the standard input to a 0MQ socket and
    return an exclusive pair socket from which you can read lines retrieved
    from the standard input.  You will receive a final empty line when the EOF
    character is input to the keyboard."""
    reader = context.socket(zmq.PAIR)
    reader.connect('inproc://standard-input')
    writer = context.socket(zmq.PAIR)
    writer.bind('inproc://standard-input')
    thread = threading.Thread(target=forward_lines,
                              args=(sys.stdin, writer))
    thread.start()
    return reader


if __name__ == '__main__':
    context = zmq.Context()
    reader = forward_standard_input(context)
    poller = zmq.Poller()
    poller.register(reader, zmq.POLLIN)
    poller.register(...)

    events = dict(poller.poll())
    if events.get(reader, 0) & zmq.POLLIN:
        line = reader.recv()
        # process line.
    if events.get(..., 0) & zmq.POLLIN:
        # ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9448247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档