File tree 5 files changed +37
-2
lines changed
5 files changed +37
-2
lines changed Original file line number Diff line number Diff line change @@ -195,7 +195,7 @@ def get_context(self, method=None):
195
195
def get_start_method (self , allow_none = False ):
196
196
return self ._name
197
197
198
- def set_start_method (self , method = None ):
198
+ def set_start_method (self , method , force = False ):
199
199
raise ValueError ('cannot set start method of concrete context' )
200
200
201
201
def _check_available (self ):
Original file line number Diff line number Diff line change @@ -218,7 +218,7 @@ def prepare(data):
218
218
process .ORIGINAL_DIR = data ['orig_dir' ]
219
219
220
220
if 'start_method' in data :
221
- set_start_method (data ['start_method' ])
221
+ set_start_method (data ['start_method' ], force = True )
222
222
223
223
if 'init_main_from_name' in data :
224
224
_fixup_main_from_name (data ['init_main_from_name' ])
Original file line number Diff line number Diff line change @@ -3728,6 +3728,19 @@ def test_get_all(self):
3728
3728
self .assertTrue (methods == ['fork' , 'spawn' ] or
3729
3729
methods == ['fork' , 'spawn' , 'forkserver' ])
3730
3730
3731
+ def test_preload_resources (self ):
3732
+ if multiprocessing .get_start_method () != 'forkserver' :
3733
+ self .skipTest ("test only relevant for 'forkserver' method" )
3734
+ name = os .path .join (os .path .dirname (__file__ ), 'mp_preload.py' )
3735
+ rc , out , err = test .support .script_helper .assert_python_ok (name )
3736
+ out = out .decode ()
3737
+ err = err .decode ()
3738
+ if out .rstrip () != 'ok' or err != '' :
3739
+ print (out )
3740
+ print (err )
3741
+ self .fail ("failed spawning forkserver or grandchild" )
3742
+
3743
+
3731
3744
#
3732
3745
# Check that killing process does not leak named semaphores
3733
3746
#
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 @@ -124,6 +124,10 @@ Core and Builtins
124
124
Library
125
125
-------
126
126
127
+ - Issue #28779: multiprocessing.set_forkserver_preload() would crash the
128
+ forkserver process if a preloaded module instantiated some
129
+ multiprocessing objects such as locks.
130
+
127
131
- Issue #28847: dbm.dumb now supports reading read-only files and no longer
128
132
writes the index file when it is not changed.
129
133
You can’t perform that action at this time.
0 commit comments