[英]Python: multiprocessing.map fails with queue.FULL
我正在使用map()
函數
from concurrent.futures import ProcessPoolExecutor
為了做一個簡單的數據並行化。
我想處理400個文件,使用map()
對其調用處理函數。
infiles = glob.glob(os.path.join(input_path, '**/*.xls'), recursive=True) + glob.glob(os.path.join(input_path, '**/*.xlsx'), recursive=True)
outfiles = [os.path.join(os.path.dirname(infile), os.path.basename(infile).split('.')[0]+'.csv') for infile in infiles]
with ProcessPoolExecutor(max_workers=None) as executor:
executor.map(excel2csv, infiles, outfiles)
因此應為每個文件調用excel2csv()
,並傳遞其所需的輸入和輸出路徑。 它將獨立處理每個文件,將結果寫入光盤,並且不返回任何內容。
大約100個文件后,應用程序將引發異常,抱怨隊列已滿。
Exception in thread Thread-1:
Traceback (most recent call last):
File "/home/mapa17/miniconda3/envs/pygng/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/home/mapa17/miniconda3/envs/pygng/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/home/mapa17/miniconda3/envs/pygng/lib/python3.5/concurrent/futures/process.py", line 295, in _queue_management_worker
shutdown_worker()
File "/home/mapa17/miniconda3/envs/pygng/lib/python3.5/concurrent/futures/process.py", line 253, in shutdown_worker
call_queue.put_nowait(None)
File "/home/mapa17/miniconda3/envs/pygng/lib/python3.5/multiprocessing/queues.py", line 129, in put_nowait
return self.put(obj, False)
File "/home/mapa17/miniconda3/envs/pygng/lib/python3.5/multiprocessing/queues.py", line 83, in put
raise Full
queue.Full
我發現的最相似的問題在這里討論。
但就我而言,傳遞給worker函數的數據最少(包含兩個字符串)。 檢查默認隊列大小(來自_multiprocessing.SemLock.SEM_VALUE_MAX),其大小大於400。
有任何想法嗎? 謝謝
我發現錯誤是由executor.map()調用的worker函數中產生的異常引起的。
看來異常被消耗了嗎? 通過executor.map(),我想這已經以某種方式填滿了隊列。
我的解決方案是在excel2csv()中處理該問題,並包括一個通用的try catch異常處理,該處理不會導致Queue滿。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.