首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zmq.error.ZMQError:使用造纸机用多本笔记本运行多处理时已经在使用的地址

zmq.error.ZMQError:使用造纸机用多本笔记本运行多处理时已经在使用的地址
EN

Stack Overflow用户
提问于 2020-06-06 12:43:15
回答 1查看 4.5K关注 0票数 3

我正在使用纸厂图书馆运行多个笔记本同时使用多处理。

这发生在Python3.6.6,Red 4.8.2-15在Docker容器中。

但是,当我运行python脚本时,大约5%的笔记本无法立即工作(没有运行任何朱庇特笔记本单元格),原因是我收到了以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/opt/conda/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/opt/conda/lib/python3.6/site-packages/traitlets/config/application.py", line 657, in launch_instance
    app.initialize(argv)
  File "<decorator-gen-124>", line 2, in initialize
  File "/opt/conda/lib/python3.6/site-packages/traitlets/config/application.py", line 87, in catch_config_error
    return method(app, *args, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 469, in initialize
    self.init_sockets()
  File "/opt/conda/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 238, in init_sockets
    self.shell_port = self._bind_socket(self.shell_socket, self.shell_port)
  File "/opt/conda/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 180, in _bind_socket
    s.bind("tcp://%s:%i" % (self.ip, port))
  File "zmq/backend/cython/socket.pyx", line 547, in zmq.backend.cython.socket.Socket.bind
  File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Address already in use

连同:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/opt/conda/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "main.py", line 77, in run_papermill
    pm.execute_notebook(notebook, output_path, parameters=config)
  File "/opt/conda/lib/python3.6/site-packages/papermill/execute.py", line 104, in execute_notebook
    **engine_kwargs
  File "/opt/conda/lib/python3.6/site-packages/papermill/engines.py", line 49, in execute_notebook_with_engine
    return self.get_engine(engine_name).execute_notebook(nb, kernel_name, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/papermill/engines.py", line 304, in execute_notebook
    nb = cls.execute_managed_notebook(nb_man, kernel_name, log_output=log_output, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/papermill/engines.py", line 372, in execute_managed_notebook
    preprocessor.preprocess(nb_man, safe_kwargs)
  File "/opt/conda/lib/python3.6/site-packages/papermill/preprocess.py", line 20, in preprocess
    with self.setup_preprocessor(nb_man.nb, resources, km=km):
  File "/opt/conda/lib/python3.6/contextlib.py", line 81, in __enter__
    return next(self.gen)
  File "/opt/conda/lib/python3.6/site-packages/nbconvert/preprocessors/execute.py", line 345, in setup_preprocessor
    self.km, self.kc = self.start_new_kernel(**kwargs)
  File "/opt/conda/lib/python3.6/site-packages/nbconvert/preprocessors/execute.py", line 296, in start_new_kernel
    kc.wait_for_ready(timeout=self.startup_timeout)
  File "/opt/conda/lib/python3.6/site-packages/jupyter_client/blocking/client.py", line 104, in wait_for_ready
    raise RuntimeError('Kernel died before replying to kernel_info')
RuntimeError: Kernel died before replying to kernel_info

请帮助我解决这个问题,因为我已经在网上搜索了不同的解决方案,到目前为止还没有解决我的问题。

这个错误率为5%,不管我同时运行的笔记本数量还是计算机上的核数,这让它变得格外好奇。

我尝试过更改start方法和更新库,但都没有效果。

我的库的版本是:

代码语言:javascript
复制
papermill==1.2.1
ipython==7.14.0
jupyter-client==6.1.3

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-07 17:13:19

无法成功实现.bind().的ZeroMQ的明确问题归因点

错误信息:zmq.error.ZMQError: Address already in use更容易解释。虽然基于明显的原因,.bind()可以向许多对等方免费尝试.connect(),但是只有一个和唯一一个可以将.connect()放到特定传输类的地址目标上。

发生这种情况的潜在原因有三:

1 )偶然调用了一些代码(不知道内部细节)

通过{ multiprocessing.Process | joblib.Parallel | Docker-wrapped | ... }-spawned副本,每个副本都试图获得某些ZeroMQ传输类地址的所有权,由于明显的原因,在第一个副本成功后,任何尝试都无法成功。

这是一种相当致命的情况,在这种情况下,一些“以前”的Context()-instance进程没有设法释放此类传输类特定地址以供进一步使用(请不要记住ZeroMQ可能只是其他更感兴趣的候选人之一--配置管理缺陷),或者在这种情况下,以前的运行未能很好地终止此类资源使用,并使仍在等待(在某些情况下,直到O/S重新启动为止),侦听某些事情,这是永远不会发生的。

(3)在模块软件设计方面,EADDRINUSE是一个非常糟糕的工程实践,而不是处理记录在案的ZeroMQ错误/异常,而不是让整个马戏团崩溃(不惜一切相关的代价)。

另一条错误消息:RuntimeError: Kernel died before replying to kernel_info与状态有关,该笔记本的内核试图与自己的组件(池节点)建立所有内部连接,以至于等待时间比配置的或硬编码的超时要长,内核进程只是停止了等待,并陷入了您观察和报告的未处理的异常。

解决方案

检查是否有任何挂起的地址所有者,如果对此有疑问,请重新启动所有节点,然后确认在您自己的代码/ { multiprocessing.Process() | joblib.Parallel() | ... the likes }-calls中没有发生“隐藏”的冲突尝试,在分发后可能会尝试将.bind()放到同一个目标上。如果这些步骤中没有一个在您的控制范围内解决问题,请询问模块使用的支持,分析并帮助您重构和验证您仍然冲突的用例。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62231888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档