From 13abad2f89127e7e7b17cdecc599c554e8755be1 Mon Sep 17 00:00:00 2001 From: kuratowski Date: Tue, 5 Feb 2019 01:01:39 +0900 Subject: [PATCH] Resolve asyncio + multiprocessing problem --- .gitignore | 1 + daphne/testing.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/.gitignore b/.gitignore index 830060b..b3cff06 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea/ *.egg-info *.pyc __pycache__ diff --git a/daphne/testing.py b/daphne/testing.py index f5f3724..bc71aab 100644 --- a/daphne/testing.py +++ b/daphne/testing.py @@ -122,6 +122,16 @@ class DaphneProcess(multiprocessing.Process): def run(self): try: + # Renew the asyncio event loop without anyone knowing. + # This is necessary because asyncio behaves badly with multiprocessing. + from twisted.internet import asyncioreactor + import sys + current_reactor = sys.modules.get("twisted.internet.reactor") + if isinstance(current_reactor, asyncioreactor.AsyncioSelectorReactor): + import asyncio + current_reactor._asyncioEventloop.close() + asyncio.set_event_loop(asyncio.new_event_loop()) + current_reactor._asyncioEventloop = asyncio.get_event_loop() # Create the server class endpoints = build_endpoint_description_strings(host=self.host, port=0) self.server = Server(