Following this example in the ØMQ docs, I'm trying to create a simple receiver. The example uses infinite loop. Everything works just fine. However, on MS Windows, when I hit CTRL+C to raise KeyboardInterrupt, the loop does not break. It seems that
zmq.Poller object seems to help:
def poll_socket(socket, timetick = 100): poller = zmq.Poller() poller.register(socket, zmq.POLLIN) # wait up to 100msec try: while True: obj = dict(poller.poll(timetick)) if socket in obj and obj[socket] == zmq.POLLIN: yield socket.recv() except KeyboardInterrupt: pass # Escape while loop if there's a keyboard interrupt.
Then you can do things like:
for message in poll_socket(socket): handle_message(message)
and the for-loop will automatically terminate on Ctrl-C. It looks like the translation from Ctrl-C to a Python KeyboardInterrupt only happens when the interpreter is active and Python has not yielded control to low-level C code; the pyzmq
recv() call apparently blocks while in low-level C code, so Python never gets a chance to issue the KeyboardInterrupt. But if you use
zmq.Poller then it will stop at a timeout and give the interpreter a chance to issue the KeyboardInterrupt after the timeout is complete.