如何在Python实例方法中调用多处理代码而不会发生死锁

时间:2019-03-28 22:08:15

标签: python-multiprocessing

我想在Python中使用multiprocessing库来并行读取文件并将加载的信息存储到列表中。我还希望这种并行加载文件的方法是一个实例方法,对于某些类,其他实例方法也可以调用该方法。

当我第一次调用并行化加载函数(即load_multiple_files)时,数据将并行加载并按预期返回。但是,第二次调用该函数时,进程将死锁。

我尝试重新排序两个调用(即results_B之前的results_A),并且第二个调用的进程死锁。我也尝试删除pool.join(),但这没有成功。

这是当前的一些伪代码:

class Foo():
    def __init__(self, filepaths_A: List[str], filepaths_B: List[str]):
        results_A = load_multiple_files(filepaths_A)  # works as expected, with files loaded in parallel
        results_B = load_multiple_files(filepaths_B)  # processes deadlock and program hangs

    def load_file(self, filepath: str):
        # load file and return a numpy array
        with File(filepath, 'r') as f:
             result = l['data'][:]
        return result

    def load_multiple_files(self, filepaths: List[str]):
        """ Wrapper for loading multiple files in parallel
        pool = mp.Pool()
        results = pool.map(self.load_file, filepaths)
        pool.close()
        pool.join()

        return results

我希望无论调用load_multiple_files方法的次数如何,加载过程都会并行化并返回加载的数据。

使用multiprocessing.Pool可以解决此问题吗?

0 个答案:

没有答案