diff --git a/changelog/553.bugfix.rst b/changelog/553.bugfix.rst new file mode 100644 index 00000000..ee2be329 --- /dev/null +++ b/changelog/553.bugfix.rst @@ -0,0 +1 @@ +When using ``-n auto``, count the number of physical CPU cores instead of logical ones. diff --git a/setup.py b/setup.py index 3eac3beb..ad4675cd 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,12 @@ from setuptools import setup, find_packages -install_requires = ["execnet>=1.1", "pytest>=4.4.0", "pytest-forked", "six"] +install_requires = [ + "execnet>=1.1", + "psutil>=3.0.0", + "pytest>=4.4.0", + "pytest-forked", + "six", +] with open("README.rst") as f: diff --git a/src/xdist/plugin.py b/src/xdist/plugin.py index 51651263..e25b231f 100644 --- a/src/xdist/plugin.py +++ b/src/xdist/plugin.py @@ -1,31 +1,12 @@ -import os import uuid +import psutil import py import pytest def auto_detect_cpus(): - try: - from os import sched_getaffinity - except ImportError: - if os.environ.get("TRAVIS") == "true": - # workaround https://bitbucket.org/pypy/pypy/issues/2375 - return 2 - try: - from os import cpu_count - except ImportError: - from multiprocessing import cpu_count - else: - - def cpu_count(): - return len(sched_getaffinity(0)) - - try: - n = cpu_count() - except NotImplementedError: - return 1 - return n if n else 1 + return psutil.cpu_count(logical=False) or psutil.cpu_count() or 1 class AutoInt(int): diff --git a/testing/test_plugin.py b/testing/test_plugin.py index ca2cc2c8..31799e20 100644 --- a/testing/test_plugin.py +++ b/testing/test_plugin.py @@ -35,17 +35,10 @@ def test_dist_options(testdir): def test_auto_detect_cpus(testdir, monkeypatch): - import os + import psutil from xdist.plugin import pytest_cmdline_main as check_options - if hasattr(os, "sched_getaffinity"): - monkeypatch.setattr(os, "sched_getaffinity", lambda _pid: set(range(99))) - elif hasattr(os, "cpu_count"): - monkeypatch.setattr(os, "cpu_count", lambda: 99) - else: - import multiprocessing - - monkeypatch.setattr(multiprocessing, "cpu_count", lambda: 99) + monkeypatch.setattr(psutil, "cpu_count", lambda logical=True: 99) config = testdir.parseconfigure("-n2") assert config.getoption("numprocesses") == 2 @@ -58,10 +51,9 @@ def test_auto_detect_cpus(testdir, monkeypatch): assert config.getoption("usepdb") assert config.getoption("numprocesses") == 0 - monkeypatch.delattr(os, "sched_getaffinity", raising=False) - monkeypatch.setenv("TRAVIS", "true") + monkeypatch.setattr(psutil, "cpu_count", lambda logical=True: None) config = testdir.parseconfigure("-nauto") - assert config.getoption("numprocesses") == 2 + assert config.getoption("numprocesses") == 1 def test_boxed_with_collect_only(testdir):