Skip to content

Commit

Permalink
Resolve asyncio + multiprocessing problem when testing. (#247)
Browse files Browse the repository at this point in the history
  • Loading branch information
Joonhyung Shin authored and carltongibson committed Nov 6, 2019
1 parent d3630e0 commit 7032f8e
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.idea/
*.egg-info
*.pyc
__pycache__
Expand Down
37 changes: 37 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,43 @@ jobs:
dist: xenial
sudo: required

- os: osx
language: generic
python: '3.5'
env: TWISTED="twisted==18.7.0"
before_install:
- eval "$(pyenv init -)"
- pyenv install 3.5.5
- pyenv global 3.5.5
sudo: required
- os: osx
language: generic
python: '3.5'
env: TWISTED="twisted"
before_install:
- eval "$(pyenv init -)"
- pyenv install 3.5.5
- pyenv global 3.5.5
sudo: required
- os: osx
language: generic
python: '3.6'
env: TWISTED="twisted==18.7.0"
before_install:
- eval "$(pyenv init -)"
- pyenv install 3.6.5
- pyenv global 3.6.5
sudo: required
- os: osx
language: generic
python: '3.6'
env: TWISTED="twisted"
before_install:
- eval "$(pyenv init -)"
- pyenv install 3.6.5
- pyenv global 3.6.5
sudo: required

- stage: lint
install: pip install -U -e .[tests] black pyflakes isort
script:
Expand Down
39 changes: 34 additions & 5 deletions daphne/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,6 @@
import traceback
from concurrent.futures import CancelledError

from twisted.internet import reactor

from .endpoints import build_endpoint_description_strings
from .server import Server


class DaphneTestingInstance:
"""
Expand Down Expand Up @@ -121,6 +116,17 @@ def __init__(self, host, application, kwargs=None, setup=None, teardown=None):
self.errors = multiprocessing.Queue()

def run(self):
# OK, now we are in a forked child process, and want to use the reactor.
# However, FreeBSD systems like MacOS do not fork the underlying Kqueue,
# which asyncio (hence asyncioreactor) is built on.
# Therefore, we should uninstall the broken reactor and install a new one.
_reinstall_reactor()

from twisted.internet import reactor

from .server import Server
from .endpoints import build_endpoint_description_strings

try:
# Create the server class
endpoints = build_endpoint_description_strings(host=self.host, port=0)
Expand All @@ -143,6 +149,8 @@ def run(self):
self.errors.put((e, traceback.format_exc()))

def resolve_port(self):
from twisted.internet import reactor

if self.server.listening_addresses:
self.port.value = self.server.listening_addresses[0][1]
self.ready.set()
Expand Down Expand Up @@ -249,3 +257,24 @@ def delete_result(cls):
os.unlink(cls.result_storage)
except OSError:
pass


def _reinstall_reactor():
import sys
import asyncio

from twisted.internet import asyncioreactor

# Uninstall the reactor.
if "twisted.internet.reactor" in sys.modules:
del sys.modules["twisted.internet.reactor"]

# The daphne.server module may have already installed the reactor.
# If so, using this module will use uninstalled one, thus we should
# reimport this module too.
if "daphne.server" in sys.modules:
del sys.modules["daphne.server"]

event_loop = asyncio.new_event_loop()
asyncioreactor.install(event_loop)
asyncio.set_event_loop(event_loop)

0 comments on commit 7032f8e

Please sign in to comment.