Workaround for using __name__==#39;__main__#39; in Python multiprocessing(在Python多处理中使用__name__==_main_#39;的解决方法)
问题描述
众所周知,在使用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__':
保护包装应该是所有正确主模块的一部分。继续分发它,并注意需要多处理安全的主模块保护。
这篇关于在Python多处理中使用__name__==&_main_';的解决方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在Python多处理中使用__name__==&_main_';的解决方法
基础教程推荐
- 将 YAML 文件转换为 python dict 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01