Python v docker – RuntimeError: nemůže začít nové vlákno

0

Otázka

Jsem schopen ladit jednu chybu sám. Jsem běží python 3.8.12 uvnitř docker image na Fedora release 35 (Třicet Pět) a nejsem schopen se třou vlákna z pythonu. Je to nutné pro boto3 přenos probíhat paralelně a používá concurrent.features , aby tak učinily.

Nejjednodušší příklad, který kopíruje můj problém bez jakékoli závislosti je (zkopírováno z python docs)

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

bohužel výstup z těchto řádků je

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

To je vše, co mám. Je tam místo, kde bych měl hledat? Už jsem se dívala ulimit který říká, unlimited. Jsem tak trochu ze zoufalství, kam se podívat nebo co změnit ladění tohoto problému.

concurrency docker multithreading python
2021-11-23 20:23:24
2

Nejlepší odpověď

1

Řešení tohoto problému bylo upgradovat docker od verze 18.06.1-ce na 20.10.7.

Proč?

Je to proto, že výchozí seccomp profil Docker 20.10.9 není nastavena na podporu clone() syscall obal glibc 2.34 přijala v Ubuntu, 21.10 a Fedora 35.

Zdroj: ubuntu:21.10 a fedora:35 nefungují na nejnovější Docker (20.10.9)

2021-11-24 08:52:22
0

Vím, že to nemusí být odpověď, kterou hledáte, ale závity v Pythonu může být problematické (protože GIL). Pokud můžete, zkuste použít ProcessPoolExecutor, to je také práce s concurrent.futures. Nicméně, nevím, jestli boto3 podporuje. Pokud jste vyvolat boto3 z vašeho vlastního kódu, pak by mělo být snadné nahradit vlákna s procesy a uvidíme, jestli to funguje.

2021-11-23 20:40:30

Děkuji. Používám django sklady, které využívá boto3 pod kapotou, který používá s3transfer. Díval jsem se na prameny, a já může být schopen nahradit to, ale potřebuju se dostat k jádru tohoto problému, protože nemám tyto problémy několika týdny na stejném běží server.
Kryštof Řeháček

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................