在Python多处理中使用__name__==&_main_'的解决方法

2022-04-10 00:00:00 python python-multiprocessing

问题描述

众所周知,在使用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__':保护包装应该是所有正确主模块的一部分。继续分发它,并注意需要多处理安全的主模块保护。

相关文章