File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -196,7 +196,7 @@ def get_context(self, method=None):
196196 def get_start_method (self , allow_none = False ):
197197 return self ._name
198198
199- def set_start_method (self , method = None ):
199+ def set_start_method (self , method , force = False ):
200200 raise ValueError ('cannot set start method of concrete context' )
201201
202202 @property
Original file line number Diff line number Diff line change @@ -217,7 +217,7 @@ def prepare(data):
217217 process .ORIGINAL_DIR = data ['orig_dir' ]
218218
219219 if 'start_method' in data :
220- set_start_method (data ['start_method' ])
220+ set_start_method (data ['start_method' ], force = True )
221221
222222 if 'init_main_from_name' in data :
223223 _fixup_main_from_name (data ['init_main_from_name' ])
Original file line number Diff line number Diff line change @@ -3818,6 +3818,19 @@ def test_get_all(self):
38183818 self .assertTrue (methods == ['fork' , 'spawn' ] or
38193819 methods == ['fork' , 'spawn' , 'forkserver' ])
38203820
3821+ def test_preload_resources (self ):
3822+ if multiprocessing .get_start_method () != 'forkserver' :
3823+ self .skipTest ("test only relevant for 'forkserver' method" )
3824+ name = os .path .join (os .path .dirname (__file__ ), 'mp_preload.py' )
3825+ rc , out , err = test .support .script_helper .assert_python_ok (name )
3826+ out = out .decode ()
3827+ err = err .decode ()
3828+ if out .rstrip () != 'ok' or err != '' :
3829+ print (out )
3830+ print (err )
3831+ self .fail ("failed spawning forkserver or grandchild" )
3832+
3833+
38213834#
38223835# Check that killing process does not leak named semaphores
38233836#
Original file line number Diff line number Diff line change 1+ import multiprocessing
2+
3+ multiprocessing .Lock ()
4+
5+
6+ def f ():
7+ print ("ok" )
8+
9+
10+ if __name__ == "__main__" :
11+ ctx = multiprocessing .get_context ("forkserver" )
12+ modname = "test.mp_preload"
13+ # Make sure it's importable
14+ __import__ (modname )
15+ ctx .set_forkserver_preload ([modname ])
16+ proc = ctx .Process (target = f )
17+ proc .start ()
18+ proc .join ()
Original file line number Diff line number Diff line change @@ -171,6 +171,10 @@ Core and Builtins
171171Library
172172-------
173173
174+ - Issue #28779: multiprocessing.set_forkserver_preload() would crash the
175+ forkserver process if a preloaded module instantiated some
176+ multiprocessing objects such as locks.
177+
174178- Issue #26937: The chown() method of the tarfile.TarFile class does not fail
175179 now when the grp module cannot be imported, as for example on Android
176180 platforms.
You can’t perform that action at this time.
0 commit comments