Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Commit b09e829

Browse files
committed
Use werkzeug make_server then shutdown
1 parent 86e5746 commit b09e829

File tree

2 files changed

+23
-38
lines changed

2 files changed

+23
-38
lines changed

jupyter_dash/_stoppable_thread.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

jupyter_dash/jupyter_app.py

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import logging
2+
13
import dash
24
import os
35
import requests
@@ -9,6 +11,7 @@
911
import sys
1012
import inspect
1113
import traceback
14+
import threading
1215
import warnings
1316
import queue
1417

@@ -18,8 +21,9 @@
1821
from ansi2html import Ansi2HTMLConverter
1922
import uuid
2023

24+
from werkzeug.serving import make_server
25+
2126
from .comms import _dash_comm, _jupyter_config, _request_jupyter_config
22-
from ._stoppable_thread import StoppableThread
2327

2428

2529
def _get_skip(error: Exception):
@@ -50,7 +54,7 @@ class JupyterDash(dash.Dash):
5054
_in_colab = "google.colab" in sys.modules
5155
_token = str(uuid.uuid4())
5256

53-
_server_threads = {}
57+
_servers = {}
5458

5559
@classmethod
5660
def infer_jupyter_proxy_config(cls):
@@ -147,6 +151,7 @@ def alive():
147151
return 'Alive'
148152

149153
self.server.logger.disabled = True
154+
self._exception_handling_added = False
150155

151156
def run(
152157
self,
@@ -186,11 +191,8 @@ def run(
186191
return
187192

188193
# Get host and port
189-
host = kwargs.get("host", os.getenv("HOST", "127.0.0.1"))
190-
port = kwargs.get("port", os.getenv("PORT", "8050"))
191-
192-
kwargs['host'] = host
193-
kwargs['port'] = port
194+
host = kwargs.pop("host", os.getenv("HOST", "127.0.0.1"))
195+
port = kwargs.pop("port", os.getenv("PORT", "8050"))
194196

195197
# Validate / infer display mode
196198
if JupyterDash._in_colab:
@@ -222,11 +224,10 @@ def run(
222224
inline_exceptions = mode == "inline"
223225

224226
# Terminate any existing server using this port
225-
old_server = self._server_threads.get((host, port))
227+
old_server = self._servers.get((host, port))
226228
if old_server:
227-
old_server.kill()
228-
old_server.join()
229-
del self._server_threads[(host, port)]
229+
old_server.shutdown()
230+
del self._servers[(host, port)]
230231

231232
# Configure pathname prefix
232233
requests_pathname_prefix = self.config.get('requests_pathname_prefix', None)
@@ -302,25 +303,32 @@ def run(
302303

303304
err_q = queue.Queue()
304305

306+
server = make_server(
307+
host, port, self.server,
308+
threaded=True,
309+
processes=0
310+
)
311+
logging.getLogger("werkzeug").setLevel(logging.ERROR)
312+
305313
@retry(
306314
stop_max_attempt_number=15,
307315
wait_exponential_multiplier=100,
308316
wait_exponential_max=1000
309317
)
310318
def run():
311319
try:
312-
super_run_server(**kwargs)
320+
server.serve_forever()
313321
except SystemExit:
314322
pass
315323
except Exception as error:
316324
err_q.put(error)
317325
raise error
318326

319-
thread = StoppableThread(target=run)
320-
thread.setDaemon(True)
327+
thread = threading.Thread(target=run)
328+
thread.daemon = True
321329
thread.start()
322330

323-
self._server_threads[(host, port)] = thread
331+
self._servers[(host, port)] = server
324332

325333
# Wait for server to start up
326334
alive_url = "http://{host}:{port}/_alive_{token}".format(

0 commit comments

Comments
 (0)