forked from goodboy/tractor
1
0
Fork 0

Run Windows on trio and mp backends

The new pure trio spawning backend uses `subprocess` internally which is
also supported on windows so let's run it in CI.
drop_cloudpickle
Tyler Goodlet 2020-07-25 12:00:04 -04:00
parent 7c3928f0bf
commit dddbeb0e71
4 changed files with 41 additions and 16 deletions

View File

@ -8,6 +8,17 @@ matrix:
os: windows os: windows
language: sh language: sh
python: 3.x # only works on linux python: 3.x # only works on linux
env: SPAWN_BACKEND="mp"
before_install:
- choco install python3 --params "/InstallDir:C:\\Python"
- export PATH="/c/Python:/c/Python/Scripts:$PATH"
- python -m pip install --upgrade pip wheel
- name: "Windows, Python Latest: trio"
os: windows
language: sh
python: 3.x # only works on linux
env: SPAWN_BACKEND="trio"
before_install: before_install:
- choco install python3 --params "/InstallDir:C:\\Python" - choco install python3 --params "/InstallDir:C:\\Python"
- export PATH="/c/Python:/c/Python/Scripts:$PATH" - export PATH="/c/Python:/c/Python/Scripts:$PATH"
@ -16,6 +27,17 @@ matrix:
- name: "Windows, Python 3.7: multiprocessing" - name: "Windows, Python 3.7: multiprocessing"
os: windows os: windows
python: 3.7 # only works on linux python: 3.7 # only works on linux
env: SPAWN_BACKEND="mp"
language: sh
before_install:
- choco install python3 --version 3.7.4 --params "/InstallDir:C:\\Python"
- export PATH="/c/Python:/c/Python/Scripts:$PATH"
- python -m pip install --upgrade pip wheel
- name: "Windows, Python 3.7: trio"
os: windows
python: 3.7 # only works on linux
env: SPAWN_BACKEND="trio"
language: sh language: sh
before_install: before_install:
- choco install python3 --version 3.7.4 --params "/InstallDir:C:\\Python" - choco install python3 --version 3.7.4 --params "/InstallDir:C:\\Python"

View File

@ -6,13 +6,21 @@ import platform
import pytest import pytest
import tractor import tractor
from tractor.testing import tractor_test
# export for tests
from tractor.testing import tractor_test # noqa
pytest_plugins = ['pytester'] pytest_plugins = ['pytester']
_arb_addr = '127.0.0.1', random.randint(1000, 9999) _arb_addr = '127.0.0.1', random.randint(1000, 9999)
no_windows = pytest.mark.skipif(
platform.system() == "Windows",
reason="Test is unsupported on windows",
)
def pytest_addoption(parser): def pytest_addoption(parser):
parser.addoption( parser.addoption(
"--ll", action="store", dest='loglevel', "--ll", action="store", dest='loglevel',
@ -29,9 +37,6 @@ def pytest_addoption(parser):
def pytest_configure(config): def pytest_configure(config):
backend = config.option.spawn_backend backend = config.option.spawn_backend
if platform.system() == "Windows":
backend = 'mp'
if backend == 'mp': if backend == 'mp':
tractor._spawn.try_set_start_method('spawn') tractor._spawn.try_set_start_method('spawn')
elif backend == 'trio': elif backend == 'trio':
@ -68,10 +73,6 @@ def pytest_generate_tests(metafunc):
# incompatible with trio's global scheduler state # incompatible with trio's global scheduler state
methods.remove('fork') methods.remove('fork')
elif spawn_backend == 'trio': elif spawn_backend == 'trio':
if platform.system() == "Windows":
pytest.fail(
"Only `--spawn-backend=mp` is supported on Windows")
methods = ['trio'] methods = ['trio']
metafunc.parametrize("start_method", methods, scope='module') metafunc.parametrize("start_method", methods, scope='module')

View File

@ -10,7 +10,7 @@ import pytest
import trio import trio
import tractor import tractor
from conftest import tractor_test from conftest import tractor_test, no_windows
async def assert_err(delay=0): async def assert_err(delay=0):
@ -339,6 +339,7 @@ async def test_nested_multierrors(loglevel, start_method):
subexc.type is trio.Cancelled) subexc.type is trio.Cancelled)
@no_windows
def test_open_in_proc_cancel_via_SIGINT(loglevel, start_method): def test_open_in_proc_cancel_via_SIGINT(loglevel, start_method):
"""Ensure that a control-C (SIGINT) signal cancels both the parent and """Ensure that a control-C (SIGINT) signal cancels both the parent and
child processes in trionic fashion child processes in trionic fashion
@ -356,6 +357,7 @@ def test_open_in_proc_cancel_via_SIGINT(loglevel, start_method):
tractor.run(main) tractor.run(main)
@no_windows
def test_open_in_proc_cancel_via_SIGINT_other_task( def test_open_in_proc_cancel_via_SIGINT_other_task(
loglevel, loglevel,
start_method start_method

View File

@ -55,12 +55,13 @@ else:
def try_set_start_method(name: str) -> Optional[mp.context.BaseContext]: def try_set_start_method(name: str) -> Optional[mp.context.BaseContext]:
"""Attempt to set the start method for process starting, aka the "actor """Attempt to set the method for process starting, aka the "actor
spawning backend". spawning backend".
If the desired method is not supported this function will error. On If the desired method is not supported this function will error.
Windows the only supported option is the ``multiprocessing`` "spawn" On Windows only the ``multiprocessing`` "spawn" method is offered
method. The default on *nix systems is ``trio``. besides the default ``trio`` which uses async wrapping around
``subprocess.Popen``.
""" """
global _ctx global _ctx
global _spawn_method global _spawn_method
@ -70,9 +71,8 @@ def try_set_start_method(name: str) -> Optional[mp.context.BaseContext]:
# forking is incompatible with ``trio``s global task tree # forking is incompatible with ``trio``s global task tree
methods.remove('fork') methods.remove('fork')
# no Windows support for trip yet # supported on all platforms
if platform.system() != 'Windows': methods += ['trio']
methods += ['trio']
if name not in methods: if name not in methods:
raise ValueError( raise ValueError(