Skip to content

Commit 0f1dc31

Browse files
committed
Add quiet start/stop with automatic stop atexit.
1 parent 7918d63 commit 0f1dc31

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

src/py/kaleido/__init__.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,37 @@
1515
_global_server = _sync_server.GlobalKaleidoServer()
1616

1717

18+
def safe_start_sync_server(*args, **kwargs):
19+
"""
20+
Start a kaleido server which will process all sync generation requests.
21+
22+
The kaleido server is a singleton, so it can't be opened twice. This
23+
function will simply return if the server is already running.
24+
25+
This wrapper function takes the exact same arguments as kaleido.Kaleido().
26+
"""
27+
_global_server.ensure_opened(*args, **kwargs)
28+
29+
1830
def start_sync_server(*args, **kwargs):
1931
"""
2032
Start a kaleido server which will process all sync generation requests.
2133
22-
Only one server can be started at a time.
34+
The kaleido server is a singleton, so it can't be opened twice. This
35+
function will warn you if the server is already running.
2336
2437
This wrapper function takes the exact same arguments as kaleido.Kaleido().
2538
"""
2639
_global_server.open(*args, **kwargs)
2740

2841

29-
def stop_sync_server():
42+
def safe_stop_sync_server():
3043
"""Stop the kaleido server. It can be restarted."""
44+
_global_server.ensure_closed()
45+
46+
47+
def stop_sync_server():
48+
"""Stop the kaleido server. It can be restarted. Warns if not started."""
3149
_global_server.close()
3250

3351

src/py/kaleido/_sync_server.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import asyncio
4+
import atexit
45
import warnings
56
from queue import Queue
67
from threading import Thread
@@ -53,6 +54,15 @@ def __new__(cls):
5354
def is_running(self):
5455
return self._initialized
5556

57+
def ensure_opened(self, *args: Any, **kwargs: Any) -> None:
58+
with warnings.catch_warnings():
59+
warnings.filterwarnings(
60+
"ignore",
61+
message=r"Server already open.",
62+
category=RuntimeWarning,
63+
)
64+
self.open(*args, **kwargs)
65+
5666
def open(self, *args: Any, **kwargs: Any) -> None:
5767
"""Initialize the singleton with three values."""
5868
if self.is_running():
@@ -72,6 +82,16 @@ def open(self, *args: Any, **kwargs: Any) -> None:
7282
self._return_queue: Queue[Any] = Queue()
7383
self._thread.start()
7484
self._initialized = True
85+
atexit.register(self.ensure_closed)
86+
87+
def ensure_closed(self):
88+
with warnings.catch_warnings():
89+
warnings.filterwarnings(
90+
"ignore",
91+
message=r"Server already closed.",
92+
category=RuntimeWarning,
93+
)
94+
self.close()
7595

7696
def close(self):
7797
"""Reset the singleton back to an uninitialized state."""

0 commit comments

Comments
 (0)