22Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
33"""
44
5- import threading
5+ import multiprocessing
66import unittest
77from unittest.mock import patch, MagicMock
88
@@ -18,23 +18,22 @@ def setUp(self):
1818 self.socket = "/tmp/sock"
1919
2020 def test_success_and_failure_isolation(self):
21- success_counter = 0
22- fail_counter = 0
23- process_index = 0
24- lock = threading.Lock( )
21+ multiprocessing.set_start_method("fork", force=True)
22+ success_counter = multiprocessing.Value("i", 0)
23+ fail_counter = multiprocessing.Value("i", 0)
24+ process_index = multiprocessing.Value("i", 0 )
2525
2626 def fake_bootstrap_run(handler, lambda_runtime_client):
27- nonlocal success_counter, fail_counter, process_index
28- with lock:
29- idx = process_index
30- process_index += 1
27+ with process_index.get_lock():
28+ idx = process_index.value
29+ process_index.value += 1
3130 if idx % 2 == 0:
3231 for _ in range(3):
33- with lock :
34- success_counter += 1
32+ with success_counter.get_lock() :
33+ success_counter.value += 1
3534 else:
36- with lock :
37- fail_counter += 1
35+ with fail_counter.get_lock() :
36+ fail_counter.value += 1
3837 raise RuntimeError("Simulated failure")
3938
4039 with patch(
@@ -44,19 +43,12 @@ def fake_bootstrap_run(handler, lambda_runtime_client):
4443 side_effect=fake_bootstrap_run,
4544 ):
4645 # spawn 4 multi-concurrent processes
47- threads = []
48- for _ in range(4):
49- t = threading.Thread(
50- target=MultiConcurrentRunner.run_single,
51- args=(self.handler, self.addr, self.use_thread, self.socket),
52- )
53- t.start()
54- threads.append(t)
55- for t in threads:
56- t.join()
57-
58- self.assertEqual(success_counter, 6)
59- self.assertEqual(fail_counter, 2)
46+ MultiConcurrentRunner.run_concurrent(
47+ self.handler, self.addr, self.use_thread, self.socket, max_concurrency=4
48+ )
49+
50+ self.assertEqual(success_counter.value, 6)
51+ self.assertEqual(fail_counter.value, 2)
6052
6153
6254if __name__ == "__main__":
0 commit comments