Show More
@@ -143,21 +143,6 class BlockingShellChannel(ZMQSocketChannel): | |||
|
143 | 143 | def start(self): |
|
144 | 144 | self.socket = make_stdin_socket(self.context, self.session.bsession, self.address) |
|
145 | 145 | |
|
146 | def _handle_kernel_info_reply(self, msg): | |
|
147 | """handle kernel info reply | |
|
148 | ||
|
149 | sets protocol adaptation version | |
|
150 | """ | |
|
151 | adapt_version = int(msg['content']['protocol_version'].split('.')[0]) | |
|
152 | if adapt_version != major_protocol_version: | |
|
153 | self.session.adapt_version = adapt_version | |
|
154 | ||
|
155 | def _recv(self, **kwargs): | |
|
156 | # Listen for kernel_info_reply message to do protocol adaptation | |
|
157 | msg = ZMQSocketChannel._recv(self, **kwargs) | |
|
158 | if msg['msg_type'] == 'kernel_info_reply': | |
|
159 | self._handle_kernel_info_reply(msg) | |
|
160 | return msg | |
|
161 | 146 | |
|
162 | 147 | class BlockingIOPubChannel(ZMQSocketChannel): |
|
163 | 148 | """The iopub channel which listens for messages that the kernel publishes. |
@@ -169,9 +154,6 class BlockingIOPubChannel(ZMQSocketChannel): | |||
|
169 | 154 | |
|
170 | 155 | class BlockingStdInChannel(ZMQSocketChannel): |
|
171 | 156 | """The stdin channel to handle raw_input requests that the kernel makes.""" |
|
172 | msg_queue = None | |
|
173 | proxy_methods = ['input'] | |
|
174 | ||
|
175 | 157 | def start(self): |
|
176 | 158 | self.socket = make_stdin_socket(self.context, self.session.bsession, self.address) |
|
177 | 159 |
@@ -2,16 +2,13 | |||
|
2 | 2 | |
|
3 | 3 | Useful for test suites and blocking terminal interfaces. |
|
4 | 4 | """ |
|
5 | #----------------------------------------------------------------------------- | |
|
6 | # Copyright (C) 2013 The IPython Development Team | |
|
7 | # | |
|
8 | # Distributed under the terms of the BSD License. The full license is in | |
|
9 | # the file COPYING.txt, distributed as part of this software. | |
|
10 | #----------------------------------------------------------------------------- | |
|
5 | # Copyright (c) IPython Development Team. | |
|
6 | # Distributed under the terms of the Modified BSD License. | |
|
11 | 7 | |
|
12 | #----------------------------------------------------------------------------- | |
|
13 | # Imports | |
|
14 | #----------------------------------------------------------------------------- | |
|
8 | try: | |
|
9 | from queue import Empty # Python 3 | |
|
10 | except ImportError: | |
|
11 | from Queue import Empty # Python 2 | |
|
15 | 12 | |
|
16 | 13 | from IPython.utils.traitlets import Type |
|
17 | 14 | from IPython.kernel.client import KernelClient |
@@ -20,11 +17,22 from .channels import ( | |||
|
20 | 17 | BlockingShellChannel, BlockingStdInChannel |
|
21 | 18 | ) |
|
22 | 19 | |
|
23 | #----------------------------------------------------------------------------- | |
|
24 | # Blocking kernel manager | |
|
25 | #----------------------------------------------------------------------------- | |
|
26 | ||
|
27 | 20 | class BlockingKernelClient(KernelClient): |
|
21 | def wait_for_ready(self): | |
|
22 | # Wait for kernel info reply on shell channel | |
|
23 | while True: | |
|
24 | msg = self.shell_channel.get_msg(block=True) | |
|
25 | if msg['msg_type'] == 'kernel_info_reply': | |
|
26 | self._handle_kernel_info_reply(msg) | |
|
27 | break | |
|
28 | ||
|
29 | # Flush IOPub channel | |
|
30 | while True: | |
|
31 | try: | |
|
32 | msg = self.iopub_channel.get_msg(block=True, timeout=0.2) | |
|
33 | print(msg['msg_type']) | |
|
34 | except Empty: | |
|
35 | break | |
|
28 | 36 | |
|
29 | 37 | # The classes to use for the various channels |
|
30 | 38 | shell_channel_class = Type(BlockingShellChannel) |
@@ -4,7 +4,7 | |||
|
4 | 4 | # Distributed under the terms of the Modified BSD License. |
|
5 | 5 | |
|
6 | 6 | from __future__ import absolute_import |
|
7 | from IPython.kernel.channels import validate_string_dict | |
|
7 | from IPython.kernel.channels import validate_string_dict, major_protocol_version | |
|
8 | 8 | from IPython.utils.py3compat import string_types |
|
9 | 9 | |
|
10 | 10 | import zmq |
@@ -90,6 +90,7 class KernelClient(ConnectionFileMixin): | |||
|
90 | 90 | """ |
|
91 | 91 | if shell: |
|
92 | 92 | self.shell_channel.start() |
|
93 | self.kernel_info() | |
|
93 | 94 | if iopub: |
|
94 | 95 | self.iopub_channel.start() |
|
95 | 96 | if stdin: |
@@ -327,6 +328,15 class KernelClient(ConnectionFileMixin): | |||
|
327 | 328 | self.shell_channel._queue_send(msg) |
|
328 | 329 | return msg['header']['msg_id'] |
|
329 | 330 | |
|
331 | def _handle_kernel_info_reply(self, msg): | |
|
332 | """handle kernel info reply | |
|
333 | ||
|
334 | sets protocol adaptation version | |
|
335 | """ | |
|
336 | adapt_version = int(msg['content']['protocol_version'].split('.')[0]) | |
|
337 | if adapt_version != major_protocol_version: | |
|
338 | self.session.adapt_version = adapt_version | |
|
339 | ||
|
330 | 340 | def shutdown(self, restart=False): |
|
331 | 341 | """Request an immediate kernel shutdown. |
|
332 | 342 |
@@ -421,17 +421,8 def start_new_kernel(startup_timeout=60, kernel_name='python', **kwargs): | |||
|
421 | 421 | km.start_kernel(**kwargs) |
|
422 | 422 | kc = km.client() |
|
423 | 423 | kc.start_channels() |
|
424 | kc.wait_for_ready() | |
|
424 | 425 | |
|
425 | kc.kernel_info() | |
|
426 | kc.get_shell_msg(block=True, timeout=startup_timeout) | |
|
427 | ||
|
428 | # Flush channels | |
|
429 | for channel in (kc.shell_channel, kc.iopub_channel): | |
|
430 | while True: | |
|
431 | try: | |
|
432 | channel.get_msg(block=True, timeout=0.1) | |
|
433 | except Empty: | |
|
434 | break | |
|
435 | 426 | return km, kc |
|
436 | 427 | |
|
437 | 428 | @contextmanager |
@@ -92,6 +92,7 def setup_kernel(cmd): | |||
|
92 | 92 | client = BlockingKernelClient(connection_file=connection_file) |
|
93 | 93 | client.load_connection_file() |
|
94 | 94 | client.start_channels() |
|
95 | client.wait_for_ready() | |
|
95 | 96 | |
|
96 | 97 | try: |
|
97 | 98 | yield client |
@@ -366,6 +366,14 StdInChannelABC.register(QtStdInChannel) | |||
|
366 | 366 | class QtKernelClient(QtKernelClientMixin, KernelClient): |
|
367 | 367 | """ A KernelClient that provides signals and slots. |
|
368 | 368 | """ |
|
369 | def start_channels(self, shell=True, iopub=True, stdin=True, hb=True): | |
|
370 | if shell: | |
|
371 | self.shell_channel.kernel_info_reply.connect(self._handle_kernel_info_reply) | |
|
372 | super(QtKernelClient, self).start_channels(shell, iopub, stdin, hb) | |
|
373 | ||
|
374 | def _handle_kernel_info_reply(self, msg): | |
|
375 | super(QtKernelClient, self)._handle_kernel_info_reply(msg) | |
|
376 | self.shell_channel.kernel_info_reply.disconnect(self._handle_kernel_info_reply) | |
|
369 | 377 | |
|
370 | 378 | iopub_channel_class = Type(QtIOPubChannel) |
|
371 | 379 | shell_channel_class = Type(QtShellChannel) |
General Comments 0
You need to be logged in to leave comments.
Login now