旧环境(Ubuntu18.04+Docker19.03.13)下Python3.10+的multiprocessing.Manager异常问题求助
旧环境(Ubuntu18.04+Docker19.03.13)下Python3.10+的multiprocessing.Manager异常问题求助
我遇到了一个棘手的问题:需要在装有Docker 19.03.13的Ubuntu18.04主机上部署Python应用,但目前这两者都没法更新,只能在现有环境下解决问题。
当我尝试运行应用时,它总是因为多进程相关的异常崩溃。我把问题简化成了两行测试代码来复现:
from multiprocessing import Manager Manager().dict()
我试过不同版本的Python3官方镜像,但所有测试过的3.10+版本都抛出了两种异常之一:
第一种是连接重置错误:
ConnectionResetError: [Errno 104] Connection reset by peer
对应的完整报错栈:
Python 3.12.8 (main, Dec 4 2024, 20:39:47) [GCC 12.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from multiprocessing import Manager >>> Manager().dict() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.12/multiprocessing/managers.py", line 726, in temp token, exp = self._create(typeid, *args, **kwds) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/multiprocessing/managers.py", line 606, in _create conn = self._Client(self._address, authkey=self._authkey) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/multiprocessing/connection.py", line 525, in Client answer_challenge(c, authkey) File "/usr/local/lib/python3.12/multiprocessing/connection.py", line 953, in answer_challenge message = connection.recv_bytes(256) # reject large message ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/multiprocessing/connection.py", line 216, in recv_bytes buf = self._recv_bytes(maxlength) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/multiprocessing/connection.py", line 430, in _recv_bytes buf = self._recv(4) ^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/multiprocessing/connection.py", line 395, in _recv chunk = read(handle, remaining) ^^^^^^^^^^^^^^^^^^^^^^^ ConnectionResetError: [Errno 104] Connection reset by peer
第二种是文件找不到错误:
FileNotFoundError: [Errno 2] No such file or directory
对应的完整报错栈:
Python 3.10.16 (main, Dec 4 2024, 20:37:22) [GCC 12.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from multiprocessing import Manager >>> Manager().dict() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.10/multiprocessing/managers.py", line 723, in temp token, exp = self._create(typeid, *args, **kwds) File "/usr/local/lib/python3.10/multiprocessing/managers.py", line 606, in _create conn = self._Client(self._address, authkey=self._authkey) File "/usr/local/lib/python3.10/multiprocessing/connection.py", line 502, in Client c = SocketClient(address) File "/usr/local/lib/python3.10/multiprocessing/connection.py", line 630, in SocketClient s.connect(address) FileNotFoundError: [Errno 2] No such file or directory
我的测试方式是通过以下命令启动Docker容器,然后在交互式解释器中运行上述两行代码:
docker run -it --entrypoint=/bin/bash python:VERSION
我试过的大多数Python版本都出现了上述异常,只有python:3.8.2能够正常运行。
另外,在其他装有较新OS和Docker的机器上,所有Python版本都能正常工作。
所以我的问题是:在不更新主机OS和Docker的前提下,如何让Python3.10+在这个旧环境中正常运行?
备注:内容来源于stack exchange,提问作者Sergey Yampol
相关产品推荐
相关产品推荐

