Вот возможное решение этой проблемы, которое сработало для меня, поскольку дочерние процессы не требуют импорта керас.
if __name__ != '__mp_main__': #This line solves the problem
import keras
from multiprocessing import Pool
def foo(q,y):
print("In foo")
return q,y
def test(a, b):
x = []
if __name__ == '__main__':
p = Pool(5)
print("Starting")
x = p.starmap(foo, [[a,2],[b,4]])
print("Finished")
p.close()
p.join()
print(x)
if __name__ == '__main__':
test(1,3)
print(keras.backend)
Как я нашел это решение, было очень странно. Я запустил оригинальный код, и он завис как обычно. Затем, даже когда он завис, я закомментировал строку импорта и сохранил файл для следующего теста. Как только я это сделал, код как-то завершился. Я проверил это несколько раз, чтобы убедиться, что это не случайность. Как редактирование файла уже запущенной программы может повлиять на ее работу? Затем я подумал, что if __name__ == '__main__' может быть похож на if (fork () == 0) в c, поэтому я включил его во время импорта, чтобы дочерние процессы не запускали его. Так же, как если бы я вручную комментировал это и сохранял во время выполнения. Я проверил это, и оно работает.
Редактировать: Если вы используете if __name__ == __main__, тогда наследование нарушается, так как они не являются основными, как кажется. mp_main - это имя работников пула, и это также работает