docker中的Python – RuntimeError:无法启动新线程

Kry*_*ček 29 python concurrency multithreading docker

我自己无法调试一个错误。我在 Fedora 版本 35(三十五)上的 docker 镜像中运行 python 3.8.12,但无法从 python 生成线程。传输需要boto3并行运行,并且它用来concurrent.features这样做。

在没有任何依赖关系的情况下复制我的问题的最简单的示例是(从 python 文档复制

import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']

def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            pass
Run Code Online (Sandbox Code Playgroud)

遗憾的是这些行的输出是

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in <dictcomp>
  File "/usr/lib64/python3.8/concurrent/futures/thread.py", line 188, in submit
    self._adjust_thread_count()
  File "/usr/lib64/python3.8/concurrent/futures/thread.py", line 213, in _adjust_thread_count
    t.start()
  File "/usr/lib64/python3.8/threading.py", line 852, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread
Run Code Online (Sandbox Code Playgroud)

这就是我的全部。有我应该看的地方吗?我已经查过了ulimit,上面写着unlimited。我有点绝望到哪里去寻找或改变什么来调试这个问题。

Kry*_*ček 49

这个问题的解决方案是将docker从18.06.1-ce版本升级到20.10.7。

为什么?

这是因为 Docker 20.10.9 的默认 seccomp 配置文件未调整为支持 Ubuntu 21.10 和 Fedora 35 中采用的 glibc 2.34 的 clone() 系统调用包装器。

来源:ubuntu:21.10 和 fedora:35 不适用于最新的 Docker (20.10.9)

  • 这是一个很好的建议。就我而言,只需将基本图像从 _bookworm_ 降级为 _bullseye_ 就解决了问题。也就是说,Debian 11 的 glibc 必须仍然兼容 Docker _19.03.13_。谢谢! (7认同)
  • 对于在运行 dind 图像的 bitbucket pipeline 自托管运行器中看到此问题的任何人,此修复也适用。升级到 docker:20.10.24-dind 就成功了。 (3认同)
  • gitlab pipelines 上有同样的问题,20.10.24 版本解决了我的问题。感谢您的评论! (3认同)
  • 我在使用 `20.10.8` docker 版本后收到事件 (2认同)

小智 23

我在docker中安装Flask时遇到了这个问题。进度条导致了这个问题,所以我解决了pip install Flask --progress-bar off