[issue43329] Multiprocessing Manager Client Not Reconnecting

Ethan Furman report at bugs.python.org
Fri Jun 18 23:59:23 EDT 2021


Ethan Furman <ethan at stoneleaf.us> added the comment:

Here is the test, reduced and in a single script:

--- 8< --------------------------------------------------------------------
import multiprocessing.managers, os, sys, time

if __name__ == '__main__':
    address = ("127.0.0.1", 54321)

    class TestManager(multiprocessing.managers.BaseManager):
        pass

    if sys.argv[1] == 'server':

        class TestClass(object):
            def test_method(self):
                print("In test_method")
                return "TEST"

        TestManager.register("Test", TestClass)
        manager = TestManager(address = address, authkey = "1234".encode("utf-8"))
        print('waiting...')
        manager.get_server().serve_forever()

    else:

        TestManager.register("Test")

        manager = TestManager(address = address, authkey = "1234".encode("utf-8"))
        manager.connect()
        test_class = manager.Test()

        print(test_class.test_method())

        print("Kill and restart the server and press return")
        sys.stdin.readline()

        try:
            print(test_class.test_method())
        except EOFError:
            print('EOF received\n')

        # reestablish connection
        manager.connect()
        test_class = manager.Test()

        # trigger error
        print(test_class.test_method())
--- 8< --------------------------------------------------------------------

Running it in two terminals gives (only showing client side):

---------------------------------------------------------------------------
$ ./python ~/test_mp client
TEST
Kill and restart the server and press return
# hit <return>
EOF received

Traceback (most recent call last):
  File "/home/ethan/test_mp", line 45, in <module>
    print(test_class.test_method())
  File "<string>", line 2, in test_method
  File "/source/virtualenv/lib/python3.9/multiprocessing/managers.py", line 808, in _callmethod
    conn.send((self._id, methodname, args, kwds))
  File "/source/virtualenv/lib/python3.9/multiprocessing/connection.py", line 211, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/source/virtualenv/lib/python3.9/multiprocessing/connection.py", line 416, in _send_bytes
    self._send(header + buf)
  File "/source/virtualenv/lib/python3.9/multiprocessing/connection.py", line 373, in _send
    n = write(self._handle, buf)
BrokenPipeError: [Errno 32] Broken pipe
---------------------------------------------------------------------------

The problem appears to be that the call to `manager.connect()` after the EOF is not getting a new connection, but is reusing the old one (?).  This is as far as I can take this; hopefully somebody with more multiprocessing/socket skills can take it from here.

----------
nosy: +davin, pitrou, serhiy.storchaka
versions: +Python 3.10, Python 3.11, Python 3.9 -Python 3.8

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue43329>
_______________________________________


More information about the Python-bugs-list mailing list