[Python-checkins] bpo-43867: multiprocessing Server catchs SystemExit (GH-25441)

vstinner webhook-mailer at python.org
Fri Apr 16 13:42:46 EDT 2021


https://github.com/python/cpython/commit/7c29ae1f0585378dba4d220a2c0fb5dd49fdab3e
commit: 7c29ae1f0585378dba4d220a2c0fb5dd49fdab3e
branch: master
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2021-04-16T19:42:34+02:00
summary:

bpo-43867: multiprocessing Server catchs SystemExit (GH-25441)

The multiprocessing Server class now explicitly catchs SystemExit and
closes the client connection in this case. It happens when the
Server.serve_client() method reachs the end of file (EOF).

files:
A Misc/NEWS.d/next/Library/2021-04-16-16-46-44.bpo-43867.xT9QjF.rst
M Lib/multiprocessing/managers.py

diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py
index 0eb16c664cfab..6ee9521c76b48 100644
--- a/Lib/multiprocessing/managers.py
+++ b/Lib/multiprocessing/managers.py
@@ -192,11 +192,8 @@ def accepter(self):
             t.daemon = True
             t.start()
 
-    def handle_request(self, c):
-        '''
-        Handle a new connection
-        '''
-        funcname = result = request = None
+    def _handle_request(self, c):
+        request = None
         try:
             connection.deliver_challenge(c, self.authkey)
             connection.answer_challenge(c, self.authkey)
@@ -213,6 +210,7 @@ def handle_request(self, c):
                 msg = ('#TRACEBACK', format_exc())
             else:
                 msg = ('#RETURN', result)
+
         try:
             c.send(msg)
         except Exception as e:
@@ -224,7 +222,17 @@ def handle_request(self, c):
             util.info(' ... request was %r', request)
             util.info(' ... exception was %r', e)
 
-        c.close()
+    def handle_request(self, conn):
+        '''
+        Handle a new connection
+        '''
+        try:
+            self._handle_request(conn)
+        except SystemExit:
+            # Server.serve_client() calls sys.exit(0) on EOF
+            pass
+        finally:
+            conn.close()
 
     def serve_client(self, conn):
         '''
diff --git a/Misc/NEWS.d/next/Library/2021-04-16-16-46-44.bpo-43867.xT9QjF.rst b/Misc/NEWS.d/next/Library/2021-04-16-16-46-44.bpo-43867.xT9QjF.rst
new file mode 100644
index 0000000000000..1ec914e5ee9d0
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-04-16-16-46-44.bpo-43867.xT9QjF.rst
@@ -0,0 +1,3 @@
+The :mod:`multiprocessing` ``Server`` class now explicitly catchs
+:exc:`SystemExit` and closes the client connection in this case. It happens
+when the ``Server.serve_client()`` method reachs the end of file (EOF).



More information about the Python-checkins mailing list