From 5ce8a6ec1aa36cf68478808d5199c07ba00df50c Mon Sep 17 00:00:00 2001 From: Pavel Pristupa Date: Wed, 17 Oct 2018 16:37:13 +0700 Subject: [PATCH] Add maxprocesses option to limit the maximum number of workers when using numprocesses=auto Fix #337 --- changelog/337.feature | 3 +++ testing/test_plugin.py | 4 ++++ xdist/plugin.py | 13 ++++++++++++- xdist/remote.py | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 changelog/337.feature diff --git a/changelog/337.feature b/changelog/337.feature new file mode 100644 index 00000000..7425db9d --- /dev/null +++ b/changelog/337.feature @@ -0,0 +1,3 @@ +``` +Add --maxprocesses command-line option to limit the maximum number of workers when using --numprocesses=auto +``` diff --git a/testing/test_plugin.py b/testing/test_plugin.py index 182a3e5b..0ea5b747 100644 --- a/testing/test_plugin.py +++ b/testing/test_plugin.py @@ -25,6 +25,10 @@ def test_dist_options(testdir): check_options(config) assert config.option.dist == "load" assert config.option.tx == ["popen"] * 2 + config = testdir.parseconfigure("--numprocesses", "3", "--maxprocesses", "2") + check_options(config) + assert config.option.dist == "load" + assert config.option.tx == ["popen"] * 2 config = testdir.parseconfigure("-d") check_options(config) assert config.option.dist == "load" diff --git a/xdist/plugin.py b/xdist/plugin.py index 9c7324cd..336c93a6 100644 --- a/xdist/plugin.py +++ b/xdist/plugin.py @@ -47,6 +47,14 @@ def pytest_addoption(parser): "you can use 'auto' here for auto detection CPUs number on " "host system", ) + group._addoption( + "--maxprocesses", + dest="maxprocesses", + metavar="maxprocesses", + action="store", + type=int, + help="limit the maximum number of workers to process the tests when using --numprocesses=auto", + ) group.addoption( "--max-worker-restart", "--max-slave-restart", @@ -172,7 +180,10 @@ def pytest_cmdline_main(config): if config.option.numprocesses: if config.option.dist == "no": config.option.dist = "load" - config.option.tx = ["popen"] * config.option.numprocesses + numprocesses = config.option.numprocesses + if config.option.maxprocesses: + numprocesses = min(numprocesses, config.option.maxprocesses) + config.option.tx = ["popen"] * numprocesses if config.option.distload: config.option.dist = "load" val = config.getvalue diff --git a/xdist/remote.py b/xdist/remote.py index bee34711..0c5aa300 100644 --- a/xdist/remote.py +++ b/xdist/remote.py @@ -234,6 +234,7 @@ def remote_initconfig(option_dict, args): config.option.dist = "no" config.option.distload = False config.option.numprocesses = None + config.option.maxprocesses = None config.args = args return config