Skip to content

Commit c8c68ab

Browse files
committed
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 proposed in pytest-dev/execnet#243, so this patch should not be merged until there is a release version of execnet supporting the main_thread_only execmodel. Closes: pytest-dev#620
1 parent f57c658 commit c8c68ab

File tree

4 files changed

+10
-4
lines changed

4 files changed

+10
-4
lines changed

src/xdist/looponfail.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def trace(self, *args):
7676
print("RemoteControl:", msg)
7777

7878
def initgateway(self):
79-
return execnet.makegateway("popen")
79+
return execnet.makegateway("execmodel=main_thread_only//popen")
8080

8181
def setup(self, out=None):
8282
if out is None:

src/xdist/workermanage.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ def __init__(self, config, specs=None, defaultchdir="pyexecnetcache") -> None:
4141
self.testrunuid = self.config.getoption("testrunuid")
4242
if self.testrunuid is None:
4343
self.testrunuid = uuid.uuid4().hex
44-
self.group = execnet.Group()
44+
self.group = execnet.Group(execmodel="main_thread_only")
4545
if specs is None:
4646
specs = self._getxspecs()
4747
self.specs = []
4848
for spec in specs:
4949
if not isinstance(spec, execnet.XSpec):
5050
spec = execnet.XSpec(spec)
51+
if getattr(spec, "execmodel", None) != "main_thread_only":
52+
spec = execnet.XSpec(f"execmodel=main_thread_only//{spec}")
5153
if not spec.chdir and not spec.popen:
5254
spec.chdir = defaultchdir
5355
self.group.allocate_id(spec)
@@ -68,6 +70,10 @@ def setup_nodes(self, putevent):
6870
return [self.setup_node(spec, putevent) for spec in self.specs]
6971

7072
def setup_node(self, spec, putevent):
73+
if not isinstance(spec, execnet.XSpec):
74+
spec = execnet.XSpec(spec)
75+
if getattr(spec, "execmodel", None) != "main_thread_only":
76+
spec = execnet.XSpec(f"execmodel=main_thread_only//{spec}")
7177
gw = self.group.makegateway(spec)
7278
self.config.hook.pytest_xdist_newgateway(gateway=gw)
7379
self.rsync_roots(gw)

testing/test_remote.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def __init__(self, request, pytester: pytest.Pytester) -> None:
3838
def setup(self) -> None:
3939
self.pytester.chdir()
4040
# import os ; os.environ['EXECNET_DEBUG'] = "2"
41-
self.gateway = execnet.makegateway()
41+
self.gateway = execnet.makegateway("execmodel=main_thread_only")
4242
self.config = config = self.pytester.parseconfigure()
4343
putevent = self.events.put if self.use_callback else None
4444

testing/test_workermanage.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def test_hrsync_filter(self, source: Path, dest: Path) -> None:
162162
assert names == {"dir", "file.txt", "somedir"}
163163

164164
def test_hrsync_one_host(self, source: Path, dest: Path) -> None:
165-
gw = execnet.makegateway("popen//chdir=%s" % dest)
165+
gw = execnet.makegateway("execmodel=main_thread_only//popen//chdir=%s" % dest)
166166
finished = []
167167
rsync = HostRSync(source)
168168
rsync.add_target_host(gw, finished=lambda: finished.append(1))

0 commit comments

Comments
 (0)