为什么Python';在Windows上启动新进程时,是否导入多处理模块\uuuuu main\uuuuuuu?
我正在为我的初学者使用一个库,我正在使用Python中的多处理模块。我遇到了这个问题: 例如,假设我有一个模块为什么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
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开始。