mirror of
https://github.com/python/cpython.git
synced 2025-08-31 22:18:28 +00:00
bpo-31151: Add socketserver.ForkingMixIn.server_close() (#3057)
* Add socketserver.ForkingMixIn.server_close() bpo-31151: socketserver.ForkingMixIn.server_close() now waits until all child processes completed to prevent leaking zombie processes. * Fix test on Windows which doesn't have ForkingMixIn
This commit is contained in:
parent
6c8c2943d9
commit
aa8ec34ad5
3 changed files with 14 additions and 6 deletions
|
@ -547,7 +547,7 @@ if hasattr(os, "fork"):
|
|||
active_children = None
|
||||
max_children = 40
|
||||
|
||||
def collect_children(self):
|
||||
def collect_children(self, *, blocking=False):
|
||||
"""Internal routine to wait for children that have exited."""
|
||||
if self.active_children is None:
|
||||
return
|
||||
|
@ -571,7 +571,8 @@ if hasattr(os, "fork"):
|
|||
# Now reap all defunct children.
|
||||
for pid in self.active_children.copy():
|
||||
try:
|
||||
pid, _ = os.waitpid(pid, os.WNOHANG)
|
||||
flags = 0 if blocking else os.WNOHANG
|
||||
pid, _ = os.waitpid(pid, flags)
|
||||
# if the child hasn't exited yet, pid will be 0 and ignored by
|
||||
# discard() below
|
||||
self.active_children.discard(pid)
|
||||
|
@ -620,6 +621,10 @@ if hasattr(os, "fork"):
|
|||
finally:
|
||||
os._exit(status)
|
||||
|
||||
def server_close(self):
|
||||
super().server_close()
|
||||
self.collect_children(blocking=True)
|
||||
|
||||
|
||||
class ThreadingMixIn:
|
||||
"""Mix-in class to handle each request in a new thread."""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue