在使用 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(使用前将#替换为@)