2012-02-25 19 views
5

stdin adresindeki veri kullanılabilirliğini kontrol etmek için zmq.Poller kullanılabilir mi? Değilse, en uygun bekleme süresi (ideal olarak), zeromq soketleri üzerinde & stdin veri kullanılabilirliği için ne olurdu?zeromq zmq.Poller ve stdin

cevap

4

evet zmq Pollers sadece sys.stdin.fileno() kontrol etmeniz gerekir böylece vb Stdin dahil yerli FDS desteklemek yapın: Eğer Windows üzerinde çalışır asla eminseniz

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) 
+0

+1: muhteşem. Teşekkürler! – jldupont

+0

** Uyarı **: Bu, Windows'ta çalışmaz ("Onaylama işlemi başarısız oldu: Soket dışında soket işlemi" hatası alıyorum). Bu muhtemelen Windows'un 'select()' uygulamasının yalnızca yuvalarda çalıştığı gerçeğiyle ilgilidir ... –

1

, sadece sys.stdin kayıt olabilirsiniz zmq.Poller ile (described by minrk, above olarak).

Ancak, select() implementation in Winsock yalnızca yuvaları destekler ve standart giriş gibi "normal" dosya tanımlayıcılarını yoklamak için kullanılamaz. Bu nedenle, Windows üzerinde çalışırken, standart girdiyi inproc taşımada bir 0MQ soketiyle birleştirmeniz gerekir. özel bir çifti soketi kullanılarak

Önerilen uygulama:

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: 
     # ...