首页 文章

使用多处理的__name__变量的令人费解的行为(Python 2.7)

提问于
浏览
1

今天我搞乱了多处理库,我注意到了一些奇怪的东西 . 我试图弄清楚是否有可能使用多处理嵌套脚本(一个使用多处理来运行脚本的一部分的脚本,该脚本使用多处理来运行脚本的更多部分) . 为了解决这个问题,我开始研究 __name__ 变量对于子脚本的作用,因为如果你熟悉多处理,你知道这将是一个问题

当我写一个测试脚本时,结果让我感到惊讶 . 我写了这个简单的脚本:来自多处理导入池

def Child(Inf):
    print "Child" + __name__

if __name__ == "__main__":
    Process = Pool(4)
    Process.map(Child, [0,0,0,0])
    print "Parent" + __name__

(不要介意四个零的列表)

控制台打印出来:

Child__main__
Child__main__
Child__main__
Child__main__
Parent__main__

这意味着子进程的 __name__ 也是 __main__

if __name__ == "__main__":

这是困扰我的部分 . 测试后,似乎子进程运行了4次,而if语句只运行一次 . 这在读取代码时是有意义的,但是测试显示所有进程都被调用相同,并且计算机不应该能够区分它们,因为子进程查看与父进程没有区别的变量 .

我对此感到困惑,因为我以为我理解如何放入if语句也会阻止子进程运行主程序,但这似乎是不真实的 .

我错过了一条重要的线索,或者这只是我不应该看的奇怪的东西? :p

问候,
危害

2 回答

  • 0

    会发生的是每个进程都没有输入相同的输入 .

    父进程将接收并执行您输入的完整 .py 文件,而子进程将从父进程派生并将某些函数加载到内存中,并将被请求运行一个特定函数而不是运行整个程序(这将导致无限递归 . ..) .

    事实 __name__ 变量是相同的,因为每个子进程都是父进程的副本 . 他们只是处于不同的执行点 .


    On Windows OS:

    直到现在我才注意到,但是在Windows上创建多个进程时,Python会以某种方式再次运行代码 .

    在Python 3.5(也许是其他版本的Python 3,但我没有检查),它会将 __name__ 变量设置为 __mp_main__ 并避免此问题 .

    在Python 2.7上,如果值真的是 __main__ ,我唯一的解释是在输入代码运行后设置变量 . 否则,也会执行 if 块 .

    编辑:我刚刚在Python 2.7.11上测试过, __name__ 变量在设置为 __main__ 之前设置为 __parents_main__ . 我不会依赖它,因为你可以看到它在Python 3上被更改了 .

  • 0

    没有理由 __name__ 应该完全不同 . 它只会给你模块的名称(或程序本身的 __main__ ),使用它的代码所在的位置 . 而且你总是通过原始程序或它的分叉版本来调用它 .

相关问题