我自己無法除錯一個錯誤。我在 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
可悲的是,這些行的輸出是
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
這就是我的全部。有應該看的地方嗎?我已經檢查過ulimit哪個說unlimited。我有點絕望去哪里尋找或改變什么來除錯這個問題。
uj5u.com熱心網友回復:
解決此問題的方法是將 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)
uj5u.com熱心網友回復:
我知道這可能不是您正在尋找的答案,但是 Python 中的執行緒可能會出現問題(因為 GIL)。如果可以,請嘗試使用ProcessPoolExecutor,它也適用于concurrent.futures. 但是,我不知道 boto3 是否支持它。如果您從自定義代碼呼叫 boto3,那么用行程替換執行緒應該很容易,看看它是否有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366768.html
