def initIPythonKernel(): # You can remotely connect to this kernel. See the output on stdout. try: import IPython.kernel.zmq.ipkernel from IPython.kernel.zmq.ipkernel import Kernel from IPython.kernel.zmq.heartbeat import Heartbeat from IPython.kernel.zmq.session import Session from IPython.kernel import write_connection_file import zmq from zmq.eventloop import ioloop from zmq.eventloop.zmqstream import ZMQStream IPython.kernel.zmq.ipkernel.signal = lambda sig, f: None # Overwrite. except ImportError as e: print("IPython import error, cannot start IPython kernel. %s" % e) return import atexit import socket import logging import threading # Do in mainthread to avoid history sqlite DB errors at exit. # https://github.com/ipython/ipython/issues/680 assert isinstance(threading.currentThread(), threading._MainThread) try: ip = socket.gethostbyname(socket.gethostname()) connection_file = "ipython-kernel-%s-%s.json" % (ip, os.getpid()) def cleanup_connection_file(): try: os.remove(connection_file) except (IOError, OSError): pass atexit.register(cleanup_connection_file) logger = logging.Logger("IPython") logger.addHandler(logging.NullHandler()) session = Session(username=u'kernel') context = zmq.Context.instance() transport = "tcp" addr = "%s://%s" % (transport, ip) shell_socket = context.socket(zmq.ROUTER) shell_port = shell_socket.bind_to_random_port(addr) iopub_socket = context.socket(zmq.PUB) iopub_port = iopub_socket.bind_to_random_port(addr) control_socket = context.socket(zmq.ROUTER) control_port = control_socket.bind_to_random_port(addr) hb_ctx = zmq.Context() heartbeat = Heartbeat(hb_ctx, (transport, ip, 0)) hb_port = heartbeat.port heartbeat.start() shell_stream = ZMQStream(shell_socket) control_stream = ZMQStream(control_socket) kernel = Kernel(session=session, shell_streams=[shell_stream, control_stream], iopub_socket=iopub_socket, log=logger) write_connection_file(connection_file, shell_port=shell_port, iopub_port=iopub_port, control_port=control_port, hb_port=hb_port, ip=ip) #print "To connect another client to this IPython kernel, use:", \ # "ipython console --existing %s" % connection_file except Exception as e: print("Exception while initializing IPython ZMQ kernel. %s" % e) return def ipython_thread(): kernel.start() try: ioloop.IOLoop.instance().start() except KeyboardInterrupt: pass thread = threading.Thread(target=ipython_thread, name="IPython kernel") thread.daemon = True thread.start()
def complete_registration(self, msg, connect, maybe_tunnel): # print msg self.loop.remove_timeout(self._abort_timeout) ctx = self.context loop = self.loop identity = self.bident idents,msg = self.session.feed_identities(msg) msg = self.session.deserialize(msg) content = msg['content'] info = self.connection_info def url(key): """get zmq url for given channel""" return str(info["interface"] + ":%i" % info[key]) if content['status'] == 'ok': self.id = int(content['id']) # launch heartbeat # possibly forward hb ports with tunnels hb_ping = maybe_tunnel(url('hb_ping')) hb_pong = maybe_tunnel(url('hb_pong')) hb_monitor = None if self.max_heartbeat_misses > 0: # Add a monitor socket which will record the last time a ping was seen mon = self.context.socket(zmq.SUB) mport = mon.bind_to_random_port('tcp://%s' % localhost()) mon.setsockopt(zmq.SUBSCRIBE, b"") self._hb_listener = zmqstream.ZMQStream(mon, self.loop) self._hb_listener.on_recv(self._report_ping) hb_monitor = "tcp://%s:%i" % (localhost(), mport) heart = Heart(hb_ping, hb_pong, hb_monitor , heart_id=identity) heart.start() # create Shell Connections (MUX, Task, etc.): shell_addrs = url('mux'), url('task') # Use only one shell stream for mux and tasks stream = zmqstream.ZMQStream(ctx.socket(zmq.ROUTER), loop) stream.setsockopt(zmq.IDENTITY, identity) shell_streams = [stream] for addr in shell_addrs: connect(stream, addr) # control stream: control_addr = url('control') control_stream = zmqstream.ZMQStream(ctx.socket(zmq.ROUTER), loop) control_stream.setsockopt(zmq.IDENTITY, identity) connect(control_stream, control_addr) # create iopub stream: iopub_addr = url('iopub') iopub_socket = ctx.socket(zmq.PUB) iopub_socket.setsockopt(zmq.IDENTITY, identity) connect(iopub_socket, iopub_addr) # disable history: self.config.HistoryManager.hist_file = ':memory:' # Redirect input streams and set a display hook. if self.out_stream_factory: sys.stdout = self.out_stream_factory(self.session, iopub_socket, u'stdout') sys.stdout.topic = cast_bytes('engine.%i.stdout' % self.id) sys.stderr = self.out_stream_factory(self.session, iopub_socket, u'stderr') sys.stderr.topic = cast_bytes('engine.%i.stderr' % self.id) if self.display_hook_factory: sys.displayhook = self.display_hook_factory(self.session, iopub_socket) sys.displayhook.topic = cast_bytes('engine.%i.execute_result' % self.id) self.kernel = Kernel(parent=self, int_id=self.id, ident=self.ident, session=self.session, control_stream=control_stream, shell_streams=shell_streams, iopub_socket=iopub_socket, loop=loop, user_ns=self.user_ns, log=self.log) self.kernel.shell.display_pub.topic = cast_bytes('engine.%i.displaypub' % self.id) # periodically check the heartbeat pings of the controller # Should be started here and not in "start()" so that the right period can be taken # from the hubs HeartBeatMonitor.period if self.max_heartbeat_misses > 0: # Use a slightly bigger check period than the hub signal period to not warn unnecessary self.hb_check_period = int(content['hb_period'])+10 self.log.info("Starting to monitor the heartbeat signal from the hub every %i ms." , self.hb_check_period) self._hb_reporter = ioloop.PeriodicCallback(self._hb_monitor, self.hb_check_period, self.loop) self._hb_reporter.start() else: self.log.info("Monitoring of the heartbeat signal from the hub is not enabled.") # FIXME: This is a hack until IPKernelApp and IPEngineApp can be fully merged app = IPKernelApp(parent=self, shell=self.kernel.shell, kernel=self.kernel, log=self.log) app.init_profile_dir() app.init_code() self.kernel.start() else: self.log.fatal("Registration Failed: %s"%msg) raise Exception("Registration Failed: %s"%msg) self.log.info("Completed registration with id %i"%self.id)
shell_port = shell_socket.bind_to_random_port(addr) iopub_socket = context.socket(zmq.PUB) iopub_port = iopub_socket.bind_to_random_port(addr) control_socket = context.socket(zmq.ROUTER) control_port = control_socket.bind_to_random_port(addr) hb_ctx = zmq.Context() heartbeat = Heartbeat(hb_ctx, (transport, ip, 0)) hb_port = heartbeat.port heartbeat.start() shell_stream = ZMQStream(shell_socket) control_stream = ZMQStream(control_socket) kernel = Kernel(session=session, shell_streams=[shell_stream, control_stream], iopub_socket=iopub_socket, log=logger) write_connection_file(connection_file, shell_port=shell_port, iopub_port=iopub_port, control_port=control_port, hb_port=hb_port, ip=ip) print "To connect another client to this IPython kernel, use:", \ "ipython console --existing %s" % connection_file except Exception, e: print "Exception while initializing IPython ZMQ kernel. %s" % e return