是否可以使用zmq.Poller来轮询stdin上的数据可用性?如果不是,在某个时候(理想情况下),在zeromq套接字和stdin上轮询数据的最有效等待是什么?
发布于 2012-02-25 22:26:41
是的,zmq计票器确实支持本地do,包括stdin,等等,所以您只需要检查sys.stdin.fileno()。
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)发布于 2013-12-27 20:50:16
如果您确信您永远不会在Windows上运行,您可以简单地将sys.stdin注册到zmq.Poller (作为described by minrk, above)。
但是,select() implementation in Winsock只支持套接字,不能用于轮询“常规”文件描述符(如标准输入)。因此,在Windows上运行时,需要将标准输入与inproc传输上的0MQ套接字连接起来。
建议使用独占对套接字实现:
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:
# ...https://stackoverflow.com/questions/9448247
复制相似问题