Python: Почему Pool.map () зависает при попытке использовать входные аргументы для своей функции карты? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть следующая функция (сокращена для удобства чтения), которую я распараллеливаю с помощью модуля 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, печатающий простую строку, но он останавливается всякий раз, когда я 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 голосов
/ 04 июня 2019

У меня раньше была похожая проблема, и решение, которое работало для меня, заключалось в том, чтобы поместить функцию, которую вы хотите распараллелить, в отдельный модуль, а затем импортировать ее.

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

Полагаю, вы сохраните определение функции внутри файла eval_prediction.py в том же каталоге. Убедитесь, что у вас также есть __init__.py.

...