diff --git a/IPython/html/base/zmqhandlers.py b/IPython/html/base/zmqhandlers.py
index 7eec55b..6f5b302 100644
--- a/IPython/html/base/zmqhandlers.py
+++ b/IPython/html/base/zmqhandlers.py
@@ -229,9 +229,12 @@ class AuthenticatedZMQStreamHandler(ZMQStreamHandler, IPythonHandler):
# start the pinging
if self.ping_interval > 0:
- self.last_ping = ioloop.IOLoop.instance().time() # Remember time of last ping
+ loop = ioloop.IOLoop.current()
+ self.last_ping = loop.time() # Remember time of last ping
self.last_pong = self.last_ping
- self.ping_callback = ioloop.PeriodicCallback(self.send_ping, self.ping_interval)
+ self.ping_callback = ioloop.PeriodicCallback(
+ self.send_ping, self.ping_interval, io_loop=loop,
+ )
self.ping_callback.start()
def send_ping(self):
@@ -242,7 +245,7 @@ class AuthenticatedZMQStreamHandler(ZMQStreamHandler, IPythonHandler):
# check for timeout on pong. Make sure that we really have sent a recent ping in
# case the machine with both server and client has been suspended since the last ping.
- now = ioloop.IOLoop.instance().time()
+ now = ioloop.IOLoop.current().time()
since_last_pong = 1e3 * (now - self.last_pong)
since_last_ping = 1e3 * (now - self.last_ping)
if since_last_ping < 2*self.ping_interval and since_last_pong > self.ping_timeout:
@@ -254,4 +257,4 @@ class AuthenticatedZMQStreamHandler(ZMQStreamHandler, IPythonHandler):
self.last_ping = now
def on_pong(self, data):
- self.last_pong = ioloop.IOLoop.instance().time()
+ self.last_pong = ioloop.IOLoop.current().time()
diff --git a/IPython/html/notebookapp.py b/IPython/html/notebookapp.py
index d69b274..452d3aa 100644
--- a/IPython/html/notebookapp.py
+++ b/IPython/html/notebookapp.py
@@ -886,7 +886,7 @@ class NotebookApp(BaseIPythonApplication):
line = sys.stdin.readline()
if line.lower().startswith('y') and 'n' not in line.lower():
self.log.critical("Shutdown confirmed")
- ioloop.IOLoop.instance().stop()
+ ioloop.IOLoop.current().stop()
return
else:
print("No answer for 5s:", end=' ')
@@ -895,11 +895,11 @@ class NotebookApp(BaseIPythonApplication):
# set it back to original SIGINT handler
# use IOLoop.add_callback because signal.signal must be called
# from main thread
- ioloop.IOLoop.instance().add_callback(self._restore_sigint_handler)
+ ioloop.IOLoop.current().add_callback(self._restore_sigint_handler)
def _signal_stop(self, sig, frame):
self.log.critical("received signal %s, stopping", sig)
- ioloop.IOLoop.instance().stop()
+ ioloop.IOLoop.current().stop()
def _signal_info(self, sig, frame):
print(self.notebook_info())
@@ -1002,13 +1002,21 @@ class NotebookApp(BaseIPythonApplication):
b = lambda : browser.open(url_path_join(self.connection_url, uri),
new=2)
threading.Thread(target=b).start()
+
+ self.io_loop = ioloop.IOLoop.current()
try:
- ioloop.IOLoop.instance().start()
+ self.io_loop.start()
except KeyboardInterrupt:
info("Interrupted...")
finally:
self.cleanup_kernels()
self.remove_server_info_file()
+
+ def stop(self):
+ def _stop():
+ self.http_server.stop()
+ self.io_loop.stop()
+ self.io_loop.add_callback(_stop)
def list_running_servers(profile='default'):