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:
parent
b97de3dd86
commit
453bd0bc65
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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"):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add a new ``block_on_close`` class attribute to ``ForkingMixIn`` and
|
||||||
|
``ThreadingMixIn`` classes of :mod:`socketserver`.
|
Loading…
Reference in New Issue