在Python多处理中使用__name__==&_main_';的解决方法
问题描述
众所周知,在使用if __name__ == '__main__'
在Python中运行multiprocessing
代码时,需要保护main()
。
我知道在某些情况下,这对于访问Main中定义的函数是必要的,但我不明白为什么在这种情况下需要这样做:
file2.py
import numpy as np
from multiprocessing import Pool
class Something(object):
def get_image(self):
return np.random.rand(64,64)
def mp(self):
image = self.get_image()
p = Pool(2)
res1 = p.apply_async(np.sum, (image,))
res2 = p.apply_async(np.mean, (image,))
print(res1.get())
print(res2.get())
p.close()
p.join()
main.py
from file2 import Something
s = Something()
s.mp()
Something
工作所需的所有函数或导入都是file2.py
的一部分。为什么该子进程需要重新运行main.py
?
我认为__name__
解决方案不是很好,因为这会阻止我分发file2.py
的代码,因为我不能确保它们是在保护它们的Main。
没有适用于Windows的解决方案吗?
包是如何解决这个问题的(因为我从来没有遇到过不用任何包保护我的Main的问题-它们只是没有使用多进程吗?)
编辑:
我知道这是因为fork()
没有在Windows中实现。我只是问有没有办法让解释器从file2.py
而不是main.py
开始,因为我可以肯定file2.py
是自给自足的
Windows
导入主模块(但使用__name__ != '__main__'
,因为推荐答案试图在没有派生的系统上模拟类似派生的行为)。multiprocessing
无法知道您在主模块中没有做任何重要的事情,所以导入是"以防万一"进行的,以创建一个与主进程中的环境类似的环境。如果它不这样做,Main中发生的各种副作用(例如,导入、具有持久副作用的配置调用,等等)可能在子进程中未正确执行。
__main__
,代码就不是多进程安全的(也不是单元测试安全、导入安全等)。if __name__ == '__main__':
保护包装应该是所有正确主模块的一部分。继续分发它,并注意需要多处理安全的主模块保护。
相关文章