Windows上的python多处理

时间:2018-12-25 16:36:49

标签: python windows multiprocessing

我是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作为进程启动方法。)。

我的问题集中在为什么该过程似乎执行目标之外的指令。我很惊讶地看到在目标向父级发送消息之前打印输出的第二行。为什么子流程解释器运行目标之外的代码?它真的在目标代码之前运行该代码吗?为什么?

1 个答案:

答案 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()