|
2 | 2 |
|
3 | 3 | import asyncio |
4 | 4 | import os |
| 5 | +import platform |
5 | 6 | import signal |
6 | 7 | import sys |
7 | 8 | import warnings |
@@ -1373,7 +1374,11 @@ def _signal_handler(*_: Any) -> None: |
1373 | 1374 |
|
1374 | 1375 | for signal_name in {"SIGINT", "SIGTERM", "SIGBREAK"}: |
1375 | 1376 | 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) |
1377 | 1382 |
|
1378 | 1383 | server_name = self.config.get("SERVER_NAME") |
1379 | 1384 | sn_host = None |
@@ -1407,6 +1412,9 @@ def _signal_handler(*_: Any) -> None: |
1407 | 1412 | print(f" * Running on {scheme}://{host}:{port} (CTRL + C to quit)") # noqa: T201 |
1408 | 1413 |
|
1409 | 1414 | tasks = [loop.create_task(task)] |
| 1415 | + if platform.system() == "Windows": |
| 1416 | + tasks.append(loop.create_task(_windows_signal_support())) |
| 1417 | + |
1410 | 1418 | if use_reloader: |
1411 | 1419 | tasks.append(loop.create_task(observe_changes(asyncio.sleep, shutdown_event))) |
1412 | 1420 |
|
@@ -1971,3 +1979,11 @@ def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None: |
1971 | 1979 | "task": task, |
1972 | 1980 | } |
1973 | 1981 | ) |
| 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