docker 如何使用MultiProcessing,mp.Manager()运行多个AWS批处理作业,而不发生端口地址冲突错误Address already in use?

waxmsbnn  于 2023-01-25  发布在  Docker
关注(0)|答案(1)|浏览(279)

如何修复使用多处理时AWS批处理冲突端口分配?我正在使用多处理运行多个批处理容器。当两个批处理作业运行时,它们失败,地址已在使用中。此SO问题具有相同的问题,当多个容器在AWS批处理上并行运行时,带有Selenium和Chrome webdriver的Docker容器崩溃。
这就是问题所在
AWS批处理通过ECS代理与计算资源通信,ECS代理被指示在NetworkMode设置为"主机"的情况下启动作业,正如您已经确定的那样。当前,该服务不适用于运行侦听外部网络请求进入容器示例的作业。
代码:

import multiprocessing as mp
    ...
    proc = []
    mgr = mp.Manager()
    mgr_queue = mgr.Queue()
    p = mp.Process(target=func, args=(x, y, mgr_queue))
    p.start()
    ...

错误:
进程同步管理器-1:追溯(最近调用最后调用):文件"/usr/local/lib/python3.9/多重处理/www.example.com ",第315行,在_bootstrap中()文件"/usr/local/lib/python3.9/多重处理/www.example.com",第108行,在运行self._target(* self._args,self._kwargs)中文件"/usr/local/lib/python3.9/多重处理/www.example.com ",第583行, process.py 在initself._listener =套接字侦听器(地址、族、积压工作)文件"/usr/local/lib/python3.9/multiprocessing/connection.py "中,第596行,在initself._socket. bind(地址)中错误:self.run() File "/usr/local/lib/python3.9/multiprocessing/process.py", line 108, in run self._target(*self._args,self._kwargs) File "/usr/local/lib/python3.9/multiprocessing/managers.py", line 583, in _run_server server = cls._Server(registry, address, authkey, serializer) File "/usr/local/lib/python3.9/multiprocessing/managers.py", line 156, ininitself.listener = Listener(address=address, backlog=16) File "/usr/local/lib/python3.9/multiprocessing/connection.py", line 453, ininitself._listener = SocketListener(address, family, backlog) File "/usr/local/lib/python3.9/multiprocessing/connection.py", line 596, ininitself._socket.bind(address) OSError: [Errno 98] Address already in use
基于Manager的文档,它是带有BaseManager的SyncManager

class multiprocessing.managers.BaseManager([address[, authkey]])
Create a BaseManager object.

Once created one should call start() or get_server().serve_forever() to ensure that the manager object refers to a started manager process.

address is the address on which the manager process listens for new connections. If address is None then an arbitrary one is chosen.

由于我没有提供一个端口给mp. Manager(),它看起来好像是一个任意端口,但这不是真的,你如何解决这个问题?如果可能的话,我很乐意改变网络"主机"。

bvuwiixz

bvuwiixz1#

结果发现这个错误是由于Python 3.9中Unix抽象地址的实现(here)。这导致Unix机器上multiprocessing.Manager()的默认套接字地址不是很随机。正如OP所指出的,容器在AWS批处理上运行时与主机共享其地址,所以这种非随机性使得它很可能(甚至保证)套接字地址在同一台机器上的容器之间发生冲突。suggested fix是在初始化Manager之前设置multiprocessing.util.abstract_sockets_supported = False。这使得套接字地址再次变得极其随机,从而确保它们不会冲突。
所以只需补充:

import multiprocessing
import multiprocessing.util
...
multiprocessing.util.abstract_sockets_supported = False
mgr = multiprocessing.Manager()
...

相关问题