bpo-33540: Add block_on_close attr to socketserver (GH-6911)

Add a new block_on_close class attribute to ForkingMixIn and
ThreadingMixIn classes of socketserver to opt-in for pre-3.7 behaviour.
This commit is contained in:
Victor Stinner 2018-05-24 03:14:44 +02:00 committed by GitHub
parent b97de3dd86
commit 453bd0bc65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 12 deletions

View File

@ -116,10 +116,13 @@ server classes.
only available on POSIX platforms that support :func:`~os.fork`. only available on POSIX platforms that support :func:`~os.fork`.
:meth:`socketserver.ForkingMixIn.server_close` waits until all child :meth:`socketserver.ForkingMixIn.server_close` waits until all child
processes complete. processes complete, except if
:attr:`socketserver.ForkingMixIn.block_on_close` attribute is false.
:meth:`socketserver.ThreadingMixIn.server_close` waits until all non-daemon :meth:`socketserver.ThreadingMixIn.server_close` waits until all non-daemon
threads complete. Use daemonic threads by setting threads complete, except if
:attr:`socketserver.ThreadingMixIn.block_on_close` attribute is false. Use
daemonic threads by setting
:data:`ThreadingMixIn.daemon_threads` to ``True`` to not wait until threads :data:`ThreadingMixIn.daemon_threads` to ``True`` to not wait until threads
complete. complete.
@ -128,6 +131,8 @@ server classes.
:meth:`socketserver.ForkingMixIn.server_close` and :meth:`socketserver.ForkingMixIn.server_close` and
:meth:`socketserver.ThreadingMixIn.server_close` now waits until all :meth:`socketserver.ThreadingMixIn.server_close` now waits until all
child processes and non-daemonic threads complete. child processes and non-daemonic threads complete.
Add a new :attr:`socketserver.ForkingMixIn.block_on_close` class
attribute to opt-in for the pre-3.7 behaviour.
.. class:: ForkingTCPServer .. class:: ForkingTCPServer

View File

@ -1216,6 +1216,18 @@ by default.
(Contributed by Christian Heimes in :issue:`28134`.) (Contributed by Christian Heimes in :issue:`28134`.)
socketserver
------------
:meth:`socketserver.ThreadingMixIn.server_close` now waits until all non-daemon
threads complete. :meth:`socketserver.ForkingMixIn.server_close` now waits
until all child processes complete.
Add a new :attr:`socketserver.ForkingMixIn.block_on_close` class attribute to
:class:`socketserver.ForkingMixIn` and :class:`socketserver.ThreadingMixIn`
classes. Set the class attribute to ``False`` to get the pre-3.7 behaviour.
sqlite3 sqlite3
------- -------
@ -2156,10 +2168,17 @@ Changes in the Python API
and module are affected by this change. (Contributed by INADA Naoki and and module are affected by this change. (Contributed by INADA Naoki and
Eugene Toder in :issue:`29463`.) Eugene Toder in :issue:`29463`.)
* :meth:`~socketserver.BaseServer.server_close` in * :meth:`socketserver.ThreadingMixIn.server_close` now waits until all
:class:`socketserver.ThreadingMixIn` and :class:`socketserver.ForkingMixIn` non-daemon threads complete. Set the new
now waits until all non-daemon threads complete. :attr:`socketserver.ThreadingMixIn.block_on_close` class attribute to
(Contributed by Victor Stinner in :issue:`31233` and :issue:`31151`.) ``False`` to get the pre-3.7 behaviour.
(Contributed by Victor Stinner in :issue:`31233` and :issue:`33540`.)
* :meth:`socketserver.ForkingMixIn.server_close` now waits until all
child processes complete. Set the new
:attr:`socketserver.ForkingMixIn.block_on_close` class attribute to ``False``
to get the pre-3.7 behaviour.
(Contributed by Victor Stinner in :issue:`31151` and :issue:`33540`.)
* The :func:`locale.localeconv` function now temporarily sets the ``LC_CTYPE`` * The :func:`locale.localeconv` function now temporarily sets the ``LC_CTYPE``
locale to the value of ``LC_NUMERIC`` in some cases. locale to the value of ``LC_NUMERIC`` in some cases.

View File

@ -543,6 +543,8 @@ if hasattr(os, "fork"):
timeout = 300 timeout = 300
active_children = None active_children = None
max_children = 40 max_children = 40
# If true, server_close() waits until all child processes complete.
block_on_close = True
def collect_children(self, *, blocking=False): def collect_children(self, *, blocking=False):
"""Internal routine to wait for children that have exited.""" """Internal routine to wait for children that have exited."""
@ -620,7 +622,7 @@ if hasattr(os, "fork"):
def server_close(self): def server_close(self):
super().server_close() super().server_close()
self.collect_children(blocking=True) self.collect_children(blocking=self.block_on_close)
class ThreadingMixIn: class ThreadingMixIn:
@ -629,6 +631,8 @@ class ThreadingMixIn:
# Decides how threads will act upon termination of the # Decides how threads will act upon termination of the
# main process # main process
daemon_threads = False daemon_threads = False
# If true, server_close() waits until all non-daemonic threads terminate.
block_on_close = True
# For non-daemonic threads, list of threading.Threading objects # For non-daemonic threads, list of threading.Threading objects
# used by server_close() to wait for all threads completion. # used by server_close() to wait for all threads completion.
_threads = None _threads = None
@ -659,11 +663,12 @@ class ThreadingMixIn:
def server_close(self): def server_close(self):
super().server_close() super().server_close()
threads = self._threads if self.block_on_close:
self._threads = None threads = self._threads
if threads: self._threads = None
for thread in threads: if threads:
thread.join() for thread in threads:
thread.join()
if hasattr(os, "fork"): if hasattr(os, "fork"):

View File

@ -0,0 +1,2 @@
Add a new ``block_on_close`` class attribute to ``ForkingMixIn`` and
``ThreadingMixIn`` classes of :mod:`socketserver`.