我正在使用
中的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
我发现了最常见的问题here。
但在我的情况下,传递给 worker 函数的数据是最小的(包含两个字符串)。检查大小超过400的默认队列大小(来自_multiprocessing.SemLock.SEM_VALUE_MAX)。
有什么想法吗? 谢谢
答案 0 :(得分:0)
我发现错误是由executor.map()调用的worker函数中产生的异常引起的。
似乎异常被消耗了?通过executor.map(),我猜这已经以某种方式填满了队列。
我的解决方案是处理excel2csv()中的问题,并包含一个通用的try catch异常处理,它不会导致Queue填满。