python - 多处理因大量输入而被锁定
问题描述
我很难理解我遇到的问题。一些背景信息:我正在处理大量加载、处理和保存的文件。尽管文件相当大并且多处理中的步骤非常耗时,但它非常重复,因此根据这里的一些帖子,我编写了一种使用多处理并行运行它的方法。它适用于 2-4 个文件,但是当我尝试运行 10-20 个文件时它会以某种方式锁定。不过,有趣的是,显然问题出在最后一次估计或 pool.join 中,因为除了一个文件之外的所有数据都被保存了。老实说,我什至不知道如何确定问题所在。有没有人建议我可以尝试做什么或问题可能出在哪里?这是一个MRE:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import multiprocessing as mp
import math
import sys
import traceback
pool = None
class ProcessData:
def __init__(self):
self.multiprocessing_files()
def function_to_execute(self, foo, bar):
# some processing of files and saving to folder
print("Process: {}; Running for file {}; folder: {}".format(mp.current_process().name, foo, bar))
def multiprocessing_files(self):
data_tuple = ("x1", "y1"), ("x2", "y2"), ("x3", "z3") # input is a filename and a folder
pool = mp.get_context("spawn").Pool(int(math.floor(mp.cpu_count() / 2)))
for foo, bar in data_tuple:
pool.apply_async(func=self.func_wrapper_debug, # self.N4BiasCorrection_multiprocessing
args=(foo, bar), callback=self.prompt)
pool.close()
pool.join()
def prompt(self, result):
if result:
print('\nPreprocessing finished!')
pool.terminate()
def func_wrapper_debug(self, foo, bar):
try:
self.function_to_execute(foo, bar)
except Exception as e:
raise Exception("".join(traceback.format_exception(*sys.exc_info())))
if __name__ == '__main__':
ProcessData()
解决方案
推荐阅读
- jquery - 在 Laravel 5.6 中使用 Ajax 对 FormData 输入和文件进行多次发布
- python - 上一页 每日收盘
- php - Laravel - 首次用户
- android - 错误的AES解密结果
- django - Django:如何访问views.py中的函数
- asp.net-mvc - 日历中的格式化日期
- javascript - 如何将侦听器设置为传单自定义控件
- javascript - javascript popunder,但因国家/地区而异
- sql - 关于与内连接结合使用时的外连接
- c++ - 如何使用 Valgrind 和 Qt Creator 调试远程应用程序?