Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多处理(Python2.7)时_name__变量的令人费解的行为_Python_Multithreading_Python 2.7_Multiprocessing - Fatal编程技术网

使用多处理(Python2.7)时_name__变量的令人费解的行为

使用多处理(Python2.7)时_name__变量的令人费解的行为,python,multithreading,python-2.7,multiprocessing,Python,Multithreading,Python 2.7,Multiprocessing,今天我正在处理多处理库,我注意到一些奇怪的东西。我试图弄清楚是否可以使用多处理(使用多处理来运行脚本的一部分的脚本,而使用多处理来运行脚本的更多部分)生成嵌套脚本。为了弄清楚这一点,我开始研究子脚本的\uuu name\uuu变量是什么,因为如果您熟悉多处理,您知道这将是一个问题 当我编写测试脚本时,结果令我惊讶。我写了这个简单的脚本: 来自多处理导入池 def Child(Inf): print "Child" + __name__ if __name__ == "__main__"

今天我正在处理多处理库,我注意到一些奇怪的东西。我试图弄清楚是否可以使用多处理(使用多处理来运行脚本的一部分的脚本,而使用多处理来运行脚本的更多部分)生成嵌套脚本。为了弄清楚这一点,我开始研究子脚本的
\uuu name\uuu
变量是什么,因为如果您熟悉多处理,您知道这将是一个问题

当我编写测试脚本时,结果令我惊讶。我写了这个简单的脚本: 来自多处理导入池

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__
这意味着子进程的
\uuuuu name\uuuuuuu
也是
\uuuuu main\uuuuuu

if __name__ == "__main__":
这是让我困惑的部分。测试之后,子进程似乎运行了4次,而if语句只运行了一次。这在读取代码时是有意义的,但测试表明,所有进程都被称为相同的,并且计算机不应该能够区分它们之间的差异,因为子进程查看的变量与父进程没有什么不同

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

是一条重要的线索丢失了,还是这只是我不该看的奇怪的东西p

问候,

危害

发生的情况是,每个进程没有输入相同的输入

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

\uuuu name\uuuu
变量是相同的,因为每个子进程都是父进程的副本。它们只是处于不同的执行点


在Windows操作系统上:

直到现在我才注意到,但是Python在Windows上创建多个进程时,不知何故再次运行了代码

在Python3.5上(也可能是Python3的其他版本,但我没有检查),它将
\uuuu name\uuuuu
变量设置为
\uuu mp\u main\uuuuu
,从而避免问题

在Python2.7上,如果值真的是
\uuuu main\uuuu
,我唯一的解释是变量是在输入代码运行之后设置的。否则,也将执行
if


编辑:我刚刚在Python2.7.11上进行了测试,
\uuuuuu name\uuuuuuuu
变量在设置为
\uuuuuuuu main\uuuuuuuu
之前被设置为
\uuuuuuu main>。我不会依赖它,因为正如您所看到的,它是在Python3上更改的。

没有理由让
\uuuu name\uuuuu
完全不同。它只会给出使用它的代码所在的模块的名称(如果是程序本身,则为
\uuuu main\uuu
)。您总是从原始程序或其派生版本调用它。

您使用的是哪个操作系统?
多处理
模块使用不同的方法在不同的操作系统上创建子进程。通常只有Windows会出现多次运行
\uuuu main\uuu
的问题(因为它没有
fork
)。在Python 3的最新版本中,您可以在操作系统支持的任何生成算法之间进行选择(在早期版本中,您只需选择开发人员为您选择的算法即可)。“如果您熟悉多处理,您知道这将是一个问题–我熟悉多处理,但我不知道这应该是个问题。在学习多处理时,我被告知“if name==”主"是为了阻止子进程执行主代码。但我猜这不是真的吗?@HarmPrins正如我所说,创建子进程是一个fork操作。它会将当前进程复制到另一个进程中,而不会再次执行整个python文件。这将是一个非常缓慢的操作。因此,不必担心子进程执行任何事情,除了它被告知要执行的内容。如果你仍然不相信。尝试在
If\uu name\uuuu…
行之前添加一个
print
语句。它也只会运行一次!如果在If语句之前添加一个print语句,它会打印5次(显然),这就够奇怪了如果我使用链接,它的工作方式应该是这样的,但是如果我复制脚本并运行它,它会打印5次,有时也会弄糟。@HarmPrins您在Windows上吗?因为任何类似unix的操作系统上的fork都应该这样工作。