Skip to content

Commit 68da65c

Browse files
committed
Fix signal handling on Windows
This follows Hypercorn and both switches to signal rather than loop signal handling if the latter isn't implemented and adds a periodic IO event as required for Python 3.7.
1 parent 136f156 commit 68da65c

1 file changed

Lines changed: 17 additions & 1 deletion

File tree

src/quart/app.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import asyncio
44
import os
5+
import platform
56
import signal
67
import sys
78
import warnings
@@ -1373,7 +1374,11 @@ def _signal_handler(*_: Any) -> None:
13731374

13741375
for signal_name in {"SIGINT", "SIGTERM", "SIGBREAK"}:
13751376
if hasattr(signal, signal_name):
1376-
loop.add_signal_handler(getattr(signal, signal_name), _signal_handler)
1377+
try:
1378+
loop.add_signal_handler(getattr(signal, signal_name), _signal_handler)
1379+
except NotImplementedError:
1380+
# Add signal handler may not be implemented on Windows
1381+
signal.signal(getattr(signal, signal_name), _signal_handler)
13771382

13781383
server_name = self.config.get("SERVER_NAME")
13791384
sn_host = None
@@ -1407,6 +1412,9 @@ def _signal_handler(*_: Any) -> None:
14071412
print(f" * Running on {scheme}://{host}:{port} (CTRL + C to quit)") # noqa: T201
14081413

14091414
tasks = [loop.create_task(task)]
1415+
if platform.system() == "Windows":
1416+
tasks.append(loop.create_task(_windows_signal_support()))
1417+
14101418
if use_reloader:
14111419
tasks.append(loop.create_task(observe_changes(asyncio.sleep, shutdown_event)))
14121420

@@ -1971,3 +1979,11 @@ def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None:
19711979
"task": task,
19721980
}
19731981
)
1982+
1983+
1984+
async def _windows_signal_support() -> None:
1985+
# See https://bugs.python.org/issue23057, to catch signals on
1986+
# Windows it is necessary for an IO event to happen periodically.
1987+
# Fixed by Python 3.8
1988+
while True:
1989+
await asyncio.sleep(1)

0 commit comments

Comments
 (0)