Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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
为什么Python';在Windows上启动新进程时,是否导入多处理模块\uuuuu main\uuuuuuu?_Python_Windows_Python 2.7_Multiprocessing - Fatal编程技术网

为什么Python';在Windows上启动新进程时,是否导入多处理模块\uuuuu main\uuuuuuu?

为什么Python';在Windows上启动新进程时,是否导入多处理模块\uuuuu main\uuuuuuu?,python,windows,python-2.7,multiprocessing,Python,Windows,Python 2.7,Multiprocessing,我正在为我的初学者使用一个库,我正在使用Python中的多处理模块。我遇到了这个问题: 例如,假设我有一个模块mylibrary.py: # mylibrary.py from multiprocessing import Process class MyProcess(Process): def run(self): print "Hello from the new process" def foo(): p = MyProcess() p.st

我正在为我的初学者使用一个库,我正在使用Python中的多处理模块。我遇到了这个问题:

例如,假设我有一个模块
mylibrary.py

# mylibrary.py

from multiprocessing import Process

class MyProcess(Process):
    def run(self):
        print "Hello from the new process"

def foo():
    p = MyProcess()
    p.start()
以及调用此库的主程序:

# main.py

import mylibrary

mylibrary.foo()
如果我在Windows上运行
main.py
,它会尝试将main.py导入新进程,这意味着代码会再次执行,从而导致进程生成的无限循环。我可以这样修复它:

import mylibrary

if __name__ == "__main__":
    mylibrary.foo()
但是,对于初学者来说,这是相当混乱的,而且它似乎不应该是必要的。新流程正在
mylibrary
中创建,为什么新流程不导入
mylibrary
?有没有一种方法可以解决这个问题而不必更改
main.py


顺便说一下,我使用的是Python 2.7。

Windows没有
fork
,因此无法创建与现有进程相同的新进程。因此,子进程必须再次运行代码,但现在需要一种方法来区分父进程和子进程,而
\uuuuuu main\uuuuu
就是这样

这在这里的文档中有介绍:


我不知道还有什么方法可以构造代码以避免分叉炸弹效应。

我肯定我遗漏了一些东西,但我的问题是为什么子进程必须再次运行所有代码。为什么不仅仅是启动新流程的模块?@Laura:它必须再次运行您的所有代码,因为如果它不运行,它就不会有您的代码。子进程以全新的方式启动,如果您想让它拥有您的函数,它需要您的代码。@NedBatchelder:这仍然不能真正回答问题。在发布的示例中,新流程只需要
run
函数。为什么它必须导入其他模块才能运行一个功能?@Laura:关键是,有一个应该调用该模块的上下文,即主脚本所在的上下文。由于Windows没有fork,它不能只将上下文复制到新进程中,它必须调用主脚本才能重新设置它。这就是为什么您将实际的程序代码放在
if\uuuuu name\uuuuu==“\uuuuu main\uuuuu”:
块中。导致它的一切只是设置环境(所有导入、函数定义等)。@Laura回答为什么子进程必须再次运行所有代码–当您执行
import mylibrary
mylibrary时,mylibrary成为全局命名空间的一部分(与main.py共享),因此当您随后调用
mylibrary.foo()时
然后foo在此命名空间中运行,这可能会影响其行为。为了确保foo在子流程中的运行方式与在主流程中的运行方式完全相同,您必须在完全相同的命名空间(环境)中运行它,唯一的方法是从一开始就运行所有内容,从执行main.py开始。