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

Workaround for using __name__==#39;__main__#39; in Python multiprocessing(在Python多处理中使用__name__==_main_#39;的解决方法)
本文介绍了在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__':保护包装应该是所有正确主模块的一部分。继续分发它,并注意需要多处理安全的主模块保护。

这篇关于在Python多处理中使用__name__==&_main_'的解决方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)