tornado 5 fixes

- ._running private attribute is removed. We don't need it anymore,
  since we were only using it while the application was run in a background thread.
- call blocking cleanup in a thread because asyncio doesn't allow multiple loops in one thread.
This commit is contained in:
Min RK
2018-01-03 14:12:02 +01:00
parent 691c4c158f
commit 4729ae4769
2 changed files with 20 additions and 8 deletions

View File

@@ -1625,10 +1625,7 @@ class JupyterHub(Application):
if not self.io_loop:
return
if self.http_server:
if self.io_loop._running:
self.io_loop.add_callback(self.http_server.stop)
else:
self.http_server.stop()
self.http_server.stop()
self.io_loop.add_callback(self.io_loop.stop)
@gen.coroutine

View File

@@ -1,5 +1,6 @@
"""mock utilities for testing"""
from concurrent.futures import ThreadPoolExecutor
import os
import sys
from tempfile import NamedTemporaryFile
@@ -202,11 +203,11 @@ class MockHub(JupyterHub):
@default('authenticator_class')
def _authenticator_class_default(self):
return MockPAMAuthenticator
@default('spawner_class')
def _spawner_class_default(self):
return MockSpawner
def init_signal(self):
pass
@@ -229,11 +230,25 @@ class MockHub(JupyterHub):
def stop(self):
super().stop()
IOLoop().run_sync(self.cleanup)
# run cleanup in a background thread
# to avoid multiple eventloops in the same thread errors from asyncio
def cleanup():
loop = IOLoop.current()
loop.run_sync(self.cleanup)
loop.close()
pool = ThreadPoolExecutor(1)
f = pool.submit(cleanup)
# wait for cleanup to finish
f.result()
pool.shutdown()
# ignore the call that will fire in atexit
self.cleanup = lambda : None
self.db_file.close()
@gen.coroutine
def login_user(self, name):
"""Login a user by name, returning her cookies."""