Python中并行处理中的过程流



我正在学习python中的并行处理,我对以下程序的执行流有一些非常具体的疑问。在此程序中,我将列表分为两个部分,具体取决于过程。我的目的是在一个过程中列出列表的一部分,而另一部分则参与另一个过程。

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)从输出中,我们可以看到一个过程首先被执行,然后是另一个过程。该程序实际上是否利用多个处理器进行并行处理?如果没有,我该如何使其类似地处理?如果是类似的处理,则应随机执行打印语句打印('1')print('2'),对吗?

2)我可以通过编程性检查程序运行哪个处理器?

3)为什么在Main之外的打印语句(Main Hello,Main,Main外部)被执行三次?

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

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

2)通常未分配过程到特定的CPU,而是在它们之间跳跃

3)如果您要为每个启动过程使用Windows,则必须再次执行模块。对于这些执行,__name__不是'main',但是执行了所有无条件命令(在if之外),例如这些print s。

4)当在Windows上调用Processstart()时,启动了新的Python解释器,这意味着将必要的模块导入(并因此执行),并且运行子过程的必要资源交给了新的解释器(" Spawn"-Method在https://docs.python.org/3.6/library/multiprocessing.html#contexts-and-start-methods上描述。然后所有过程独立运行(如果程序未完成同步)

相关内容

  • 没有找到相关文章

最新更新