From a6cdb64cde327dc5a6f8aa7bba14a1f18efe9194 2010-08-03 18:21:38
From: Brian Granger <ellisonbg@gmail.com>
Date: 2010-08-03 18:21:38
Subject: [PATCH] Added initial draft of blockingkernelmanager.py.

---

diff --git a/IPython/zmq/blockingkernelmanager.py b/IPython/zmq/blockingkernelmanager.py
new file mode 100644
index 0000000..8f0ded0
--- /dev/null
+++ b/IPython/zmq/blockingkernelmanager.py
@@ -0,0 +1,44 @@
+from kernelmanager import SubSocketChannel
+from Queue import Queue, Empty
+
+
+class MsgNotReady(Exception):
+    pass
+
+
+class BlockingSubSocketChannel(SubSocketChannel):
+
+    def __init__(self, context, session, address=None):
+        super(BlockingSubSocketChannel, self).__init__(context, session, address)
+        self._in_queue = Queue()
+
+    def call_handlers(self, msg):
+        self._in_queue.put(msg)
+
+    def msg_ready(self):
+        """Is there a message that has been received?"""
+        if self._in_queue.qsize() == 0:
+            return False
+        else:
+            return True
+
+    def get_msg(self, block=True, timeout=None):
+        """Get a message if there is one that is ready."""
+        try:
+            msg = self.in_queue.get(block, timeout)
+        except Empty:
+            raise MsgNotReady('No message has been received.')
+        else:
+            return msg
+
+    def get_msgs(self):
+        """Get all messages that are currently ready."""
+        msgs = []
+        while True:
+            try:
+                msg = self.get_msg(block=False)
+            except MsgNotReady:
+                break
+            else:
+                msgs.append(msg)
+        return msgs
\ No newline at end of file