Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
clean
  • Loading branch information
sshane committed Jul 26, 2025
commit b43b0092be430427d5b5606f6657b03fe313062c
2 changes: 2 additions & 0 deletions src/xdist/scheduler/loadscope.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ def add_node(self, node: WorkerController) -> None:
"""
assert node not in self.assigned_work
self.assigned_work[node] = {}
# sort by gw id
self.assigned_work = dict(sorted(self.assigned_work.items(), key=lambda item: item[0].gateway.id))

def remove_node(self, node: WorkerController) -> str | None:
"""Remove a node from the scheduler.
Expand Down
12 changes: 11 additions & 1 deletion src/xdist/workermanage.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

from collections.abc import Sequence
from concurrent.futures import ThreadPoolExecutor
import enum
import fnmatch
import os
Expand Down Expand Up @@ -94,15 +95,24 @@ def setup_nodes(
) -> list[WorkerController]:
self.config.hook.pytest_xdist_setupnodes(config=self.config, specs=self.specs)
self.trace("setting up nodes")
return [self.setup_node(spec, putevent) for spec in self.specs]
with ThreadPoolExecutor(max_workers=len(self.specs)) as executor:
futs = [
executor.submit(self.setup_node, spec, putevent, idx)
for idx, spec in enumerate(self.specs)
]
return [f.result() for f in futs]
# return [self.setup_node(spec, putevent) for spec in self.specs]

def setup_node(
self,
spec: execnet.XSpec,
putevent: Callable[[tuple[str, dict[str, Any]]], None],
idx: int | None = None,
) -> WorkerController:
if getattr(spec, "execmodel", None) != "main_thread_only":
spec = execnet.XSpec(f"execmodel=main_thread_only//{spec}")
# if idx is not None:
# spec = execnet.XSpec(f"{spec}//id=gw{idx}")
gw = self.group.makegateway(spec)
self.config.hook.pytest_xdist_newgateway(gateway=gw)
self.rsync_roots(gw)
Expand Down