File tree Expand file tree Collapse file tree 2 files changed +40
-15
lines changed
Misc/NEWS.d/next/Core_and_Builtins Expand file tree Collapse file tree 2 files changed +40
-15
lines changed Original file line number Diff line number Diff line change @@ -70,22 +70,46 @@ def _reentrant_call_error(self):
70
70
raise ReentrantCallError (
71
71
"Reentrant call into the multiprocessing resource tracker" )
72
72
73
- def _stop (self ):
74
- with self ._lock :
75
- # This should not happen (_stop() isn't called by a finalizer)
76
- # but we check for it anyway.
77
- if self ._lock ._recursion_count () > 1 :
78
- return self ._reentrant_call_error ()
79
- if self ._fd is None :
80
- # not running
81
- return
82
-
83
- # closing the "alive" file descriptor stops main()
84
- os .close (self ._fd )
85
- self ._fd = None
73
+ def __del__ (self ):
74
+ # making sure child processess are cleaned before ResourceTracker
75
+ # gets destructed.
76
+ # see https://github.com/python/cpython/issues/88887
77
+ self ._stop (use_blocking_lock = False )
78
+
79
+ def _stop (self , use_blocking_lock = True ):
80
+ if use_blocking_lock :
81
+ with self ._lock :
82
+ self ._stop_locked ()
83
+ else :
84
+ acquired = self ._lock .acquire (blocking = False )
85
+ try :
86
+ self ._stop_locked ()
87
+ finally :
88
+ if acquired :
89
+ self ._lock .release ()
90
+
91
+ def _stop_locked (
92
+ self ,
93
+ close = os .close ,
94
+ waitpid = os .waitpid ,
95
+ waitstatus_to_exitcode = os .waitstatus_to_exitcode ,
96
+ ):
97
+ # This shouldn't happen (it might when called by a finalizer)
98
+ # so we check for it anyway.
99
+ if self ._lock ._recursion_count () > 1 :
100
+ return self ._reentrant_call_error ()
101
+ if self ._fd is None :
102
+ # not running
103
+ return
104
+ if self ._pid is None :
105
+ return
106
+
107
+ # closing the "alive" file descriptor stops main()
108
+ close (self ._fd )
109
+ self ._fd = None
86
110
87
- os . waitpid (self ._pid , 0 )
88
- self ._pid = None
111
+ waitpid (self ._pid , 0 )
112
+ self ._pid = None
89
113
90
114
def getfd (self ):
91
115
self .ensure_running ()
Original file line number Diff line number Diff line change
1
+ Fixing multiprocessing Resource Tracker process leaking, usually observed when running Python as PID 1.
You can’t perform that action at this time.
0 commit comments