python:多处理.映射失败,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((调用的工作函数中产生的异常引起的。

似乎例外 executor.map((,我想这已经以某种方式填充了队列。

我的解决方案是在Excel2CSV((中处理该问题,并包括通用的尝试捕获异常处理,不会导致队列填充。

相关内容

  • 没有找到相关文章

最新更新