导入 Keras 会破坏多处理

2024-03-14

在使用 keras 时,我发现我无法使用 multiprocessing.Pool。经过一些故障排除后,我认为导入 keras 是问题的根源,并为此创建了一个简单的示例。

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)

Output

> Starting

运行时它输出“Starting”然后挂起。如果我删除 keras 导入,它会正常运行并按预期输出 [(1, 2), (3, 4)] 。知道如何解决此问题或可能导致此问题的原因吗?我还不完全理解多处理如何与 python 一起工作。谢谢!

我在我的代码中使用 anaconda 和spyder。


这是解决此问题的一个可能的解决方案,该解决方案对我有用,因为子进程不需要导入 keras。

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__' 可能类似于 c 中的 if(fork() == 0) 所以我把它放在导入周围,这样子进程就不会运行它。就像我在运行时手动注释掉并保存一样。我测试了它并且它有效。

编辑:如果您使用 if __name__ == __main__ 那么继承就会被破坏,因为它们似乎不是主要的。mp_main is the name泳池工作人员的,这也有效

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导入 Keras 会破坏多处理 的相关文章

随机推荐