##// END OF EJS Templates
move connect_[channel] to ConnectionFileMixin
MinRK -
Show More
@@ -148,25 +148,12 b' class KernelClient(LoggingConfigurable, ConnectionFileMixin):'
148 return (self.shell_channel.is_alive() or self.iopub_channel.is_alive() or
148 return (self.shell_channel.is_alive() or self.iopub_channel.is_alive() or
149 self.stdin_channel.is_alive() or self.hb_channel.is_alive())
149 self.stdin_channel.is_alive() or self.hb_channel.is_alive())
150
150
151 def _make_url(self, port):
152 """Make a zmq url with a port.
153
154 There are two cases that this handles:
155
156 * tcp: tcp://ip:port
157 * ipc: ipc://ip-port
158 """
159 if self.transport == 'tcp':
160 return "tcp://%s:%i" % (self.ip, port)
161 else:
162 return "%s://%s-%s" % (self.transport, self.ip, port)
163
164 @property
151 @property
165 def shell_channel(self):
152 def shell_channel(self):
166 """Get the shell channel object for this kernel."""
153 """Get the shell channel object for this kernel."""
167 if self._shell_channel is None:
154 if self._shell_channel is None:
168 self._shell_channel = self.shell_channel_class(
155 self._shell_channel = self.shell_channel_class(
169 self.context, self.session, self._make_url(self.shell_port)
156 self.context, self.session, self._make_url('shell')
170 )
157 )
171 return self._shell_channel
158 return self._shell_channel
172
159
@@ -175,7 +162,7 b' class KernelClient(LoggingConfigurable, ConnectionFileMixin):'
175 """Get the iopub channel object for this kernel."""
162 """Get the iopub channel object for this kernel."""
176 if self._iopub_channel is None:
163 if self._iopub_channel is None:
177 self._iopub_channel = self.iopub_channel_class(
164 self._iopub_channel = self.iopub_channel_class(
178 self.context, self.session, self._make_url(self.iopub_port)
165 self.context, self.session, self._make_url('iopub')
179 )
166 )
180 return self._iopub_channel
167 return self._iopub_channel
181
168
@@ -184,7 +171,7 b' class KernelClient(LoggingConfigurable, ConnectionFileMixin):'
184 """Get the stdin channel object for this kernel."""
171 """Get the stdin channel object for this kernel."""
185 if self._stdin_channel is None:
172 if self._stdin_channel is None:
186 self._stdin_channel = self.stdin_channel_class(
173 self._stdin_channel = self.stdin_channel_class(
187 self.context, self.session, self._make_url(self.stdin_port)
174 self.context, self.session, self._make_url('stdin')
188 )
175 )
189 return self._stdin_channel
176 return self._stdin_channel
190
177
@@ -193,7 +180,7 b' class KernelClient(LoggingConfigurable, ConnectionFileMixin):'
193 """Get the hb channel object for this kernel."""
180 """Get the hb channel object for this kernel."""
194 if self._hb_channel is None:
181 if self._hb_channel is None:
195 self._hb_channel = self.hb_channel_class(
182 self._hb_channel = self.hb_channel_class(
196 self.context, self.session, self._make_url(self.hb_port)
183 self.context, self.session, self._make_url('hb')
197 )
184 )
198 return self._hb_channel
185 return self._hb_channel
199
186
@@ -17,6 +17,8 b' Authors:'
17 # Imports
17 # Imports
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19
19
20 from __future__ import absolute_import
21
20 import glob
22 import glob
21 import json
23 import json
22 import os
24 import os
@@ -26,6 +28,8 b' from getpass import getpass'
26 from subprocess import Popen, PIPE
28 from subprocess import Popen, PIPE
27 import tempfile
29 import tempfile
28
30
31 import zmq
32
29 # external imports
33 # external imports
30 from IPython.external.ssh import tunnel
34 from IPython.external.ssh import tunnel
31
35
@@ -353,8 +357,17 b' def tunnel_to_kernel(connection_info, sshserver, sshkey=None):'
353
357
354
358
355 #-----------------------------------------------------------------------------
359 #-----------------------------------------------------------------------------
356 # Mixin for classes that workw ith connection files
360 # Mixin for classes that work with connection files
357 #-----------------------------------------------------------------------------
361 #-----------------------------------------------------------------------------
362
363 channel_socket_types = {
364 'hb' : zmq.REQ,
365 'shell' : zmq.DEALER,
366 'iopub' : zmq.SUB,
367 'stdin' : zmq.DEALER,
368 'control': zmq.DEALER,
369 }
370
358 port_names = [ "%s_port" % channel for channel in ('shell', 'stdin', 'iopub', 'hb', 'control')]
371 port_names = [ "%s_port" % channel for channel in ('shell', 'stdin', 'iopub', 'hb', 'control')]
359
372
360 class ConnectionFileMixin(HasTraits):
373 class ConnectionFileMixin(HasTraits):
@@ -466,6 +479,53 b' class ConnectionFileMixin(HasTraits):'
466 setattr(self, name, cfg[name])
479 setattr(self, name, cfg[name])
467 self.session.key = str_to_bytes(cfg['key'])
480 self.session.key = str_to_bytes(cfg['key'])
468
481
482 #--------------------------------------------------------------------------
483 # Creating connected sockets
484 #--------------------------------------------------------------------------
485
486 def _make_url(self, channel):
487 """Make a ZeroMQ URL for a given channel."""
488 transport = self.transport
489 ip = self.ip
490 port = getattr(self, '%s_port' % channel)
491
492 if transport == 'tcp':
493 return "tcp://%s:%i" % (ip, port)
494 else:
495 return "%s://%s-%s" % (transport, ip, port)
496
497 def _create_connected_socket(self, channel, identity=None):
498 """Create a zmq Socket and connect it to the kernel."""
499 url = self._make_url(channel)
500 socket_type = channel_socket_types[channel]
501 self.log.info("Connecting to: %s" % url)
502 sock = self.context.socket(socket_type)
503 if identity:
504 sock.identity = identity
505 sock.connect(url)
506 return sock
507
508 def connect_iopub(self, identity=None):
509 """return zmq Socket connected to the IOPub channel"""
510 sock = self._create_connected_socket('iopub', identity=identity)
511 sock.setsockopt(zmq.SUBSCRIBE, b'')
512 return sock
513
514 def connect_shell(self, identity=None):
515 """return zmq Socket connected to the Shell channel"""
516 return self._create_connected_socket('shell', identity=identity)
517
518 def connect_stdin(self, identity=None):
519 """return zmq Socket connected to the StdIn channel"""
520 return self._create_connected_socket('stdin', identity=identity)
521
522 def connect_hb(self, identity=None):
523 """return zmq Socket connected to the Heartbeat channel"""
524 return self._create_connected_socket('hb', identity=identity)
525
526 def connect_control(self, identity=None):
527 """return zmq Socket connected to the Heartbeat channel"""
528 return self._create_connected_socket('control', identity=identity)
469
529
470
530
471 __all__ = [
531 __all__ = [
@@ -42,14 +42,6 b' from .managerabc import ('
42 # Main kernel manager class
42 # Main kernel manager class
43 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
44
44
45 _socket_types = {
46 'hb' : zmq.REQ,
47 'shell' : zmq.DEALER,
48 'iopub' : zmq.SUB,
49 'stdin' : zmq.DEALER,
50 'control': zmq.DEALER,
51 }
52
53 class KernelManager(LoggingConfigurable, ConnectionFileMixin):
45 class KernelManager(LoggingConfigurable, ConnectionFileMixin):
54 """Manages a single kernel in a subprocess on this host.
46 """Manages a single kernel in a subprocess on this host.
55
47
@@ -145,54 +137,6 b' class KernelManager(LoggingConfigurable, ConnectionFileMixin):'
145 return self.client_factory(**kw)
137 return self.client_factory(**kw)
146
138
147 #--------------------------------------------------------------------------
139 #--------------------------------------------------------------------------
148 # Connection info
149 #--------------------------------------------------------------------------
150
151 def _make_url(self, channel):
152 """Make a ZeroMQ URL for a given channel."""
153 transport = self.transport
154 ip = self.ip
155 port = getattr(self, '%s_port' % channel)
156
157 if transport == 'tcp':
158 return "tcp://%s:%i" % (ip, port)
159 else:
160 return "%s://%s-%s" % (transport, ip, port)
161
162 def _create_connected_socket(self, channel, identity=None):
163 """Create a zmq Socket and connect it to the kernel."""
164 url = self._make_url(channel)
165 socket_type = _socket_types[channel]
166 self.log.info("Connecting to: %s" % url)
167 sock = self.context.socket(socket_type)
168 if identity:
169 sock.identity = identity
170 sock.connect(url)
171 return sock
172
173 def connect_iopub(self, identity=None):
174 """return zmq Socket connected to the IOPub channel"""
175 sock = self._create_connected_socket('iopub', identity=identity)
176 sock.setsockopt(zmq.SUBSCRIBE, b'')
177 return sock
178
179 def connect_shell(self, identity=None):
180 """return zmq Socket connected to the Shell channel"""
181 return self._create_connected_socket('shell', identity=identity)
182
183 def connect_stdin(self, identity=None):
184 """return zmq Socket connected to the StdIn channel"""
185 return self._create_connected_socket('stdin', identity=identity)
186
187 def connect_hb(self, identity=None):
188 """return zmq Socket connected to the Heartbeat channel"""
189 return self._create_connected_socket('hb', identity=identity)
190
191 def connect_control(self, identity=None):
192 """return zmq Socket connected to the Heartbeat channel"""
193 return self._create_connected_socket('control', identity=identity)
194
195 #--------------------------------------------------------------------------
196 # Kernel management
140 # Kernel management
197 #--------------------------------------------------------------------------
141 #--------------------------------------------------------------------------
198
142
General Comments 0
You need to be logged in to leave comments. Login now