pytest-xdist本质是单机多进程并行而非真正分布式,跨机器需ci编排;--dist=load因函数级分发引发gil争抢和隐式依赖冲突而慢于--dist=loadscope,后者按类/模块分组减少上下文切换。

pytest-xdist 本身不真正“分布式”,它只在单机多进程间并行执行测试,跨机器需额外编排——别指望 pip install 后直接跑集群。
为什么 pytest-xdist 的 --dist=load 有时比 --dist=loadscope 还慢
因为 --dist=load 按测试函数粒度分发,但 Python 的 GIL 和测试间隐式依赖(比如共享临时目录、全局 mock、数据库连接池)会导致进程频繁阻塞或冲突。而 --dist=loadscope 把同一个 class 或模块的测试尽量塞进同一进程,减少了上下文切换和资源争抢。
- 用
--dist=loadscope前确认测试类之间无状态共享;否则可能掩盖竞态 bug - 若大量测试函数都依赖同一
setup_module,load模式会让每个进程重复执行它,拖慢启动 - 观察
pytest --collect-only输出的测试项数量:如果单个文件里有 200+ 个test_*函数,load分配更细,但调度开销也更大
如何让 pytest-xdist 真正跑满 8 核却不被 pytest-cov 拖垮
pytest-cov 默认在每个 worker 进程里独立收集覆盖率,最后合并时容易卡死或丢数据——尤其当测试写入大量临时文件或使用 multiprocessing 时。
- 必须加
--cov-report=term-missing或--cov-report=html,禁用--cov-report=term(它会触发实时渲染,争抢 stdout) - 显式指定
--cov-config=.coveragerc,并在其中设置[run] parallel = true和[report] exclude_lines = pragma: no cover - 运行后手动合并:
coverage combine,再coverage report—— 不要依赖 xdist 自动合并
遇到 Worker crashed (exitstatus 1) 错误该怎么定位
这通常不是代码报错,而是 worker 进程启动失败,常见于环境不一致或资源限制。
- 先用
pytest -n1 --tb=short单进程跑通,排除测试本身问题 - 检查是否用了
os.chdir()或修改了sys.path:xdist worker 启动时工作目录可能不是你预期的根目录,建议所有路径用Path(__file__).parent构造 - Linux 下注意
/tmp权限或 inotify 限制:某些测试创建大量临时文件会触发Resource temporarily unavailable,可设export INOTIFY_WATCHES=524288 - 加
--debug参数输出 xdist 内部日志,重点看workeroutput和workerlog字段
真正跨机器的“分布式”得靠 CI 工具拆分 test session + SSH 手动分发,或者用 pytest-split 配合 GitHub Actions matrix;xdist 的 --tx 只适合局域网内可信主机,且要求 Python 环境、依赖、代码完全一致——差一个 patch 版本的 numpy 就可能静默失败。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











