Skip to content

Commit 0234918

Browse files
committed
Add regression test & blurb
1 parent ec33463 commit 0234918

3 files changed

Lines changed: 35 additions & 0 deletions

File tree

Lib/test/_test_multiprocessing.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6866,6 +6866,19 @@ def child():
68666866
self.assertEqual(q.get_nowait(), "done")
68676867
close_queue(q)
68686868

6869+
def test_preload_main(self):
6870+
# gh-126631: Check that __main__ can be pre-loaded
6871+
if multiprocessing.get_start_method() != "forkserver":
6872+
self.skipTest("forkserver specific test")
6873+
6874+
name = os.path.join(os.path.dirname(__file__), 'mp_preload_main.py')
6875+
rc, out, err = test.support.script_helper.assert_python_ok(name)
6876+
self.assertFalse(err, msg=err.decode())
6877+
self.assertEqual(rc, 0)
6878+
6879+
# TODO: Where is the extra empty line coming from?
6880+
out = out.decode().split("\n")
6881+
self.assertEqual(out, ['__main__', '__mp_main__', 'f', 'f', ''])
68696882

68706883
#
68716884
# Mixins

Lib/test/mp_preload_main.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import multiprocessing
2+
import sys
3+
4+
print(f"{__name__}")
5+
6+
# TODO: This is necessary as the fork server doesn't flush output after
7+
# preloading modules, and hence buffered output is inherited by child
8+
# processes. See gh-135335 (this should be removed once that is fixed).
9+
sys.stdout.flush()
10+
11+
def f():
12+
print("f")
13+
14+
if __name__ == "__main__":
15+
ctx = multiprocessing.get_context("forkserver")
16+
ctx.set_forkserver_preload(['__main__'])
17+
for _ in range(2):
18+
p = ctx.Process(target=f)
19+
p.start()
20+
p.join()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :mod:`multiprocessing` ``forkserver`` bug which prevented ``__main__``
2+
from being preloaded.

0 commit comments

Comments
 (0)