Python:尝试将输入参数用于其map函数时,为什么Pool.map()会挂起?

时间:2019-06-03 22:16:31

标签: python multiprocessing arguments

我有以下函数(为简化可读性),我使用Python的(3.5)multiprocessing模块对其进行并行化:

def evaluate_prediction(enumeration_tuple):
    i = enumeration_tuple[0]
    logits_pred = enumeration_tuple[1]
    print("This prints succesfully")
    print("This never gets printed: ")
    print(enumeration_tuple[0])
    filename = sample_names_test[i]
    onehots_pred = logits_to_onehots(logits_pred)
    np.save("/media/nfs/7_raid/ebos/models/fcn/" + channels + "/test/ndarrays/" + filename, onehots_pred)

但是,每当我尝试读取其输入参数时,该函数就会挂起。执行可以超过logits_pred = enumeration_tuple[1]行,如打印一条简单字符串的打印语句所证明的那样,但是只要我print(logits_pred)就会暂停执行。因此,显然,每当我真正需要传递的值时,该过程就会停止。我没有收到异常或错误消息。使用Python的内置map()函数或for循环时,该函数成功完成。我应该有足够的内存和可用的计算能力。所有进程都写入不同的文件。 enumerate(predictions)如预期的那样会产生正确的索引值对。我使用Pool.map()调用此函数:

pool = multiprocessing.Pool()
file_results = pool.map(evaluate_prediction, enumerate(predictions))

为什么挂了?以及如何获得例外,以便我知道出了什么问题?

更新:将映射函数外包到另一个模块,从那里导入它,并将__init__.py添加到我的目录后,我设法在元组中打印第一个项目,而不是第二个。

1 个答案:

答案 0 :(得分:0)

我以前也有类似的问题,对我有用的解决方案是将要并行化的函数放在单独的模块中,然后导入。

from eval_prediction import evaluate_prediction
pool = multiprocessing.Pool()
file_results = pool.map(evaluate_prediction, enumerate(predictions))

我假设您将函数定义保存在文件eval_prediction.py中的同一目录中。确保您也有__init __。py。