diff --git a/asgiref/server.py b/asgiref/server.py index 131ea430..186c5b1f 100644 --- a/asgiref/server.py +++ b/asgiref/server.py @@ -56,9 +56,8 @@ def run(self): """ Runs the asyncio event loop with our handler loop. """ - event_loop = asyncio.get_event_loop() try: - event_loop.run_until_complete(self.arun()) + asyncio.run(self.arun()) except KeyboardInterrupt: logger.info("Exiting due to Ctrl-C/interrupt") diff --git a/tests/test_server.py b/tests/test_server.py index f8aad448..b6205039 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -124,6 +124,32 @@ async def do_test(): pass +def test_run_creates_event_loop_when_none_exists(monkeypatch): + async def app(scope, receive, send): + pass + + class RunServer(StatelessServer): + def __init__(self): + super().__init__(app) + self.handled = False + + async def handle(self): + self.handled = True + + async def application_send(self, scope, message): + pass + + def raise_no_event_loop(): + raise RuntimeError("There is no current event loop in thread 'MainThread'.") + + monkeypatch.setattr(asyncio, "get_event_loop", raise_no_event_loop) + + server = RunServer() + server.run() + + assert server.handled + + @pytest.mark.asyncio async def test_server_delete_instance(server): """The max_applications of Server is 10. After 20 times register, application number should be 10."""