簡體   English   中英

Python:multiprocessing.map失敗,出現queue.FULL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM