我是python编程的新手,需要一些帮助来理解python解释器流程,尤其是在多处理的情况下。请注意,我正在Windows 10上运行python 3.7.1。这是我的简单实验代码和输出。
import multiprocessing
import time
def calc_square(numbers, q):
for n in numbers:
q.put(n*n)
time.sleep(0.2)
q.put(-1)
print('Exiting function')
print('Now in the main code. Process name is: ' + __name__)
if __name__ == '__main__':
numbers = [2, 3, 4, 5]
q = multiprocessing.Queue()
p = multiprocessing.Process(target=calc_square, args=(numbers, q))
p.start()
while True:
if q.empty() is False:
nq = q.get()
print('Message is:' + str(nq))
if nq == -1:
break
print('Done')
p.join()
Program Output:
Now in the main code. Process name is: __main__
Now in the main code. Process name is: __mp_main__
Message is:4
Message is:9
Message is:16
Message is:25
Exiting function
Message is:-1
Done
Process finished with exit code 0
我看过不包含if name 限定符的代码示例。我首先尝试运行其中的一个,但遇到了一些错误,这些错误指向尝试在进程初始化完成之前尝试启动一个进程。根据该代码的作者的说法,它可以在linux上运行,因为它可以分叉,而Windows则不能(我后来了解到Windows使用spawn作为进程启动方法。)。
我的问题集中在为什么该过程似乎执行目标之外的指令。我很惊讶地看到在目标向父级发送消息之前打印输出的第二行。为什么子流程解释器运行目标之外的代码?它真的在目标代码之前运行该代码吗?为什么?
答案 0 :(得分:1)
在Windows上,新进程将导入执行该脚本的主脚本。这就是为什么在Windows上需要if __name__ == '__main__':
的原因……它阻止了if
下的代码在每个进程中运行。
您的Now in main code.
行位于if
之外,因此它将在每个进程中运行。将其移至if
:
import multiprocessing
import time
def calc_square(numbers, q):
for n in numbers:
q.put(n*n)
time.sleep(0.2)
q.put(-1)
print('Exiting function')
if __name__ == '__main__':
print('Now in the main code. Process name is:', __name__)
numbers = [2, 3, 4, 5]
q = multiprocessing.Queue()
p = multiprocessing.Process(target=calc_square, args=(numbers, q))
p.start()
while True:
nq = q.get()
print('Message is:', nq)
if nq == -1:
break
print('Done')
p.join()