python - 导入 Keras 会破坏多处理
问题描述
在使用 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)
输出
> 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是池工作人员的名称,这也适用
推荐阅读
- node.js - 如何删除 MongoDB / Mongoose 中的项目并确保不会在我的数据库中出现非引用对象?
- google-analytics - Google Analytics 4:根据特定事件计数获取用户数
- javascript - 如何在 tinyMCE 中编辑 html 内容
- node.js - Node.js 上的 React.js + Express:跨站点请求的正确 cookie 设置是什么?
- performance - 一些与缓存性能相关的问题(计算机体系结构)
- c# - .Net Core 3反序列化对象列表创建“空”对象
- python - 从文件中读取和打印记录
- python - 从python中的txt文件中提取行
- mongodb - Panache 是否支持 MongoDB 中的分页?
- python - Django:有没有办法将静态与 default_if_none 一起使用?