首页 > 解决方案 > 多处理因大量输入而被锁定

问题描述

我很难理解我遇到的问题。一些背景信息:我正在处理大量加载、处理和保存的文件。尽管文件相当大并且多处理中的步骤非常耗时,但它非常重复,因此根据这里的一些帖子,我编写了一种使用多处理并行运行它的方法。它适用于 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()

标签: pythonmultiprocessinglocking

解决方案


推荐阅读