Skip to content

Commit 7a81674

Browse files
committed
fix: use spawn context for terraform pool
1 parent 14fb1cd commit 7a81674

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

src/libterraform/pool.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,10 @@ def __init__(
222222
initializer=None,
223223
initargs: tuple = (),
224224
):
225-
self._manager = (mp_context or multiprocessing).Manager()
225+
if mp_context is None:
226+
mp_context = multiprocessing.get_context("spawn")
227+
228+
self._manager = mp_context.Manager()
226229
self._cancel_registry = self._manager.dict()
227230
self._executor = ProcessPoolExecutor(
228231
max_workers=max_workers,

tests/cli/test_pool.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import pytest
66

77
from libterraform import TerraformCommand, TerraformPool
8+
import libterraform.pool as pool_module
89
from libterraform.cli import CommandResult
910
from libterraform.exceptions import TerraformCommandError
1011
from libterraform.pool import PoolCommand
@@ -69,6 +70,47 @@ def test_pool_shutdown_rejects_new_work():
6970
pool.run("version")
7071

7172

73+
def test_pool_defaults_to_spawn_context(monkeypatch):
74+
calls = []
75+
created = {}
76+
77+
class FakeManager:
78+
def dict(self):
79+
return {}
80+
81+
def shutdown(self):
82+
pass
83+
84+
class FakeContext:
85+
def Manager(self):
86+
return FakeManager()
87+
88+
class FakeExecutor:
89+
def __init__(self, **kwargs):
90+
created.update(kwargs)
91+
92+
def shutdown(self, wait=True, *, cancel_futures=False):
93+
created["shutdown"] = (wait, cancel_futures)
94+
95+
fake_context = FakeContext()
96+
97+
def fake_get_context(method):
98+
calls.append(method)
99+
return fake_context
100+
101+
monkeypatch.setattr(pool_module.multiprocessing, "get_context", fake_get_context)
102+
monkeypatch.setattr(pool_module, "ProcessPoolExecutor", FakeExecutor)
103+
104+
pool = TerraformPool(max_workers=1)
105+
pool.shutdown()
106+
107+
assert calls == ["spawn"]
108+
assert created["max_workers"] == 1
109+
assert created["mp_context"] is fake_context
110+
assert created["initargs"][0] == {}
111+
assert created["shutdown"] == (True, False)
112+
113+
72114
def test_pool_command_proxy_exposes_public_sync_methods():
73115
from libterraform.cli import _STREAM_METHODS
74116

0 commit comments

Comments
 (0)