mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
gh-90622: Prevent max_tasks_per_child use with a fork mp_context. (#91587)
Prevent `max_tasks_per_child` use with a "fork" mp_context to avoid deadlocks. Also defaults to "spawn" when no mp_context is supplied for safe convenience.
This commit is contained in:
parent
2b563f1ad3
commit
fa4f0a134e
4 changed files with 43 additions and 11 deletions
|
@ -1039,10 +1039,15 @@ class ProcessPoolExecutorTest(ExecutorTest):
|
|||
executor.shutdown()
|
||||
|
||||
def test_max_tasks_per_child(self):
|
||||
context = self.get_context()
|
||||
if context.get_start_method(allow_none=False) == "fork":
|
||||
with self.assertRaises(ValueError):
|
||||
self.executor_type(1, mp_context=context, max_tasks_per_child=3)
|
||||
return
|
||||
# not using self.executor as we need to control construction.
|
||||
# arguably this could go in another class w/o that mixin.
|
||||
executor = self.executor_type(
|
||||
1, mp_context=self.get_context(), max_tasks_per_child=3)
|
||||
1, mp_context=context, max_tasks_per_child=3)
|
||||
f1 = executor.submit(os.getpid)
|
||||
original_pid = f1.result()
|
||||
# The worker pid remains the same as the worker could be reused
|
||||
|
@ -1061,11 +1066,20 @@ class ProcessPoolExecutorTest(ExecutorTest):
|
|||
|
||||
executor.shutdown()
|
||||
|
||||
def test_max_tasks_per_child_defaults_to_spawn_context(self):
|
||||
# not using self.executor as we need to control construction.
|
||||
# arguably this could go in another class w/o that mixin.
|
||||
executor = self.executor_type(1, max_tasks_per_child=3)
|
||||
self.assertEqual(executor._mp_context.get_start_method(), "spawn")
|
||||
|
||||
def test_max_tasks_early_shutdown(self):
|
||||
context = self.get_context()
|
||||
if context.get_start_method(allow_none=False) == "fork":
|
||||
raise unittest.SkipTest("Incompatible with the fork start method.")
|
||||
# not using self.executor as we need to control construction.
|
||||
# arguably this could go in another class w/o that mixin.
|
||||
executor = self.executor_type(
|
||||
3, mp_context=self.get_context(), max_tasks_per_child=1)
|
||||
3, mp_context=context, max_tasks_per_child=1)
|
||||
futures = []
|
||||
for i in range(6):
|
||||
futures.append(executor.submit(mul, i, i))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue