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