@@ -75,8 +75,16 @@ def _reentrant_call_error(self):
7575 raise ReentrantCallError (
7676 "Reentrant call into the multiprocessing resource tracker" )
7777
78+ def __del__ (self ):
79+ # making sure child processess are cleaned before ResourceTracker
80+ # gets destructed.
81+ # see https://github.com/python/cpython/issues/88887
82+ self ._stop ()
83+
7884 def _stop (self ):
7985 with self ._lock :
86+ if self ._pid is None :
87+ return
8088 # This should not happen (_stop() isn't called by a finalizer)
8189 # but we check for it anyway.
8290 if self ._lock ._recursion_count () > 1 :
@@ -191,7 +199,7 @@ def unregister(self, name, rtype):
191199 '''Unregister name of resource with resource tracker.'''
192200 self ._send ('UNREGISTER' , name , rtype )
193201
194- def _send (self , cmd , name , rtype ):
202+ def _send (self , cmd , name , rtype ):: 77
195203 try :
196204 self .ensure_running ()
197205 except ReentrantCallError :
@@ -212,16 +220,6 @@ def _send(self, cmd, name, rtype):
212220 assert nbytes == len (msg ), "nbytes {0:n} but len(msg) {1:n}" .format (
213221 nbytes , len (msg ))
214222
215- def __del__ (self ):
216- # making sure child processess are cleaned before ResourceTracker
217- # gets destructed.
218- # see https://github.com/python/cpython/issues/88887
219- try :
220- self ._stop ()
221- except (OSError , TypeError , AttributeError ) as e :
222- pass
223-
224-
225223_resource_tracker = ResourceTracker ()
226224ensure_running = _resource_tracker .ensure_running
227225register = _resource_tracker .register
0 commit comments