python中并行处理的流程

问题描述 投票:0回答:1

我正在学习python中的并行处理,我对以下程序的执行流程有一些非常具体的疑虑。在这个程序中,我根据流程将我的列表分成两部分。我的目标是两次并行运行add函数,其中一个进程占用列表的一部分而另一个进程占用其他部分。

import multiprocessing as mp
x = [1,2,3,4]

print('hello')
def add(flag, q_f):
    global x
    if flag == 1:
        dl = x[0:2]
    elif flag == 2:
        dl = x[2:4]
    else:
        dl = x
    x = [i+2 for i in dl]
    print('flag = %d'%flag)
    print('1')
    print('2')
    print(x)
    q_f.put(x)

print('Above main')

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    print('inside main')
    q = ctx.Queue()
    jobs = []
    for i in range(2):
        p = mp.Process(target = add, args = (i+1, q))
        jobs.append(p)
    for j in jobs:
        j.start()
    for j in jobs:
        j.join()
    print('completed')
    print(q.get())
    print(q.get())

print('outside main')

我得到的输出是

hello
Above main
outside main
flag = 1
1
2
[3, 4]
hello
Above main
outside main
flag = 2
1
2
[5, 6]
hello
Above main
inside main
completed
[3, 4]
[5, 6]
outside main

我的问题是

1)从输出中,我们可以看到一个进程首先执行,然后另一个进程执行。该程序是否实际上使用多个处理器进行并行处理?如果没有,我怎样才能平行处理?如果是并行处理,则打印语句print('1')print('2')应该是随机执行的,对吧?

2)我可以通过编程方式检查程序正在运行的处理器吗?

3)为什么主要(hello,main,main)之外的print语句被执行三次?

4)程序执行的流程是什么?

python parallel-processing multiprocessing
1个回答
1
投票

1)执行add()的速度可能很快,以至于第二个进程启动时第一次执行已经结束。

2)进程通常不会分配给特定的CPU,而是在它们之间跳转

3)如果您为每个启动的进程使用Windows,则必须再次执行该模块。对于这些执行__name__不是'main',但所有无条件命令(在if等之外)像这些prints一样被执行。

4)当在Windows上调用start()Process时,启动一个新的Python解释器,这意味着导入(并因此执行)必要的模块,并且运行子进程所需的资源被传递给新的解释器(“spawn”方法描述在https://docs.python.org/3.6/library/multiprocessing.html#contexts-and-start-methods)。然后所有进程独立运行(如果程序没有同步)

© www.soinside.com 2019 - 2024. All rights reserved.