Skip to content

Commit a30949c

Browse files
zmediconicoddemus
authored andcommitted
Use execnet main_thread_only execmodel
Use the execnet main_thread_only execmodel so that code which expects to run in the main thread will just work. This execmodel has been merged to the execnet master branch via pytest-dev/execnet#243, so this patch should not be merged until there is a released version of execnet supporting the main_thread_only execmodel. Closes: pytest-dev#620
1 parent 0a4238f commit a30949c

File tree

5 files changed

+10
-5
lines changed

5 files changed

+10
-5
lines changed

changelog/620.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Use the ``execnet`` new ``main_thread_only`` "execmodel" so that code which expects to only run in the main thread will now work as expected.

src/xdist/looponfail.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def trace(self, *args: object) -> None:
8282
print("RemoteControl:", msg)
8383

8484
def initgateway(self) -> execnet.Gateway:
85-
return execnet.makegateway("popen")
85+
return execnet.makegateway("execmodel=main_thread_only//popen")
8686

8787
def setup(self) -> None:
8888
if hasattr(self, "gateway"):

src/xdist/workermanage.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,15 @@ def __init__(
5656
self.testrunuid = self.config.getoption("testrunuid")
5757
if self.testrunuid is None:
5858
self.testrunuid = uuid.uuid4().hex
59-
self.group = execnet.Group()
59+
self.group = execnet.Group(execmodel="main_thread_only")
6060
if specs is None:
6161
specs = self._getxspecs()
6262
self.specs: list[execnet.XSpec] = []
6363
for spec in specs:
6464
if not isinstance(spec, execnet.XSpec):
6565
spec = execnet.XSpec(spec)
66+
if getattr(spec, "execmodel", None) != "main_thread_only":
67+
spec = execnet.XSpec(f"execmodel=main_thread_only//{spec}")
6668
if not spec.chdir and not spec.popen:
6769
spec.chdir = defaultchdir
6870
self.group.allocate_id(spec)
@@ -90,6 +92,8 @@ def setup_node(
9092
spec: execnet.XSpec,
9193
putevent: Callable[[tuple[str, dict[str, Any]]], None],
9294
) -> WorkerController:
95+
if getattr(spec, "execmodel", None) != "main_thread_only":
96+
spec = execnet.XSpec(f"execmodel=main_thread_only//{spec}")
9397
gw = self.group.makegateway(spec)
9498
self.config.hook.pytest_xdist_newgateway(gateway=gw)
9599
self.rsync_roots(gw)

testing/test_remote.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def __init__(
4949
def setup(self) -> None:
5050
self.pytester.chdir()
5151
# import os ; os.environ['EXECNET_DEBUG'] = "2"
52-
self.gateway = execnet.makegateway()
52+
self.gateway = execnet.makegateway("execmodel=main_thread_only//popen")
5353
self.config = config = self.pytester.parseconfigure()
5454
putevent = self.events.put if self.use_callback else None
5555

testing/test_workermanage.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def test_popen_makegateway_events(
8383
assert len(call.specs) == 2
8484

8585
call = hookrecorder.popcall("pytest_xdist_newgateway")
86-
assert call.gateway.spec == execnet.XSpec("popen")
86+
assert call.gateway.spec == execnet.XSpec("execmodel=main_thread_only//popen")
8787
assert call.gateway.id == "gw0"
8888
call = hookrecorder.popcall("pytest_xdist_newgateway")
8989
assert call.gateway.id == "gw1"
@@ -177,7 +177,7 @@ def test_hrsync_filter(self, source: Path, dest: Path) -> None:
177177
assert names == {"dir", "file.txt", "somedir"}
178178

179179
def test_hrsync_one_host(self, source: Path, dest: Path) -> None:
180-
gw = execnet.makegateway("popen//chdir=%s" % dest)
180+
gw = execnet.makegateway("execmodel=main_thread_only//popen//chdir=%s" % dest)
181181
finished = []
182182
rsync = HostRSync(source)
183183
rsync.add_target_host(gw, finished=lambda: finished.append(1))

0 commit comments

Comments
 (0)