您的位置:首页 > 编程语言 > Python开发

关于Python2/3多进程的一些个人理解

2017-12-01 10:40 567 查看
# 关于多进程的一些理解

#利用multiprocessing模块里面的Process类(这里无论是Python2还是3都是如此)

from multiprocessing import Process
import time,os

def run_process(name):
    print(os.getpid(),name)
    
if __name__ == '__main__':
    print('start',os.getpid())
    for i in range(5):
        print(os.getpid())
        p = Process(target = run_process,args = (i,))
        print('------------------')
        p.start()
        #time.sleep(1)
        print('...............')
    p.join()
    print('end')
  

上面这段代码运行结果:

start 1188

1188

------------------

...............

1188

------------------

...............

1188

------------------

...............

1188

------------------

...............

1188

------------------

...............

7788 1

7664 3

2916 0

4536 2

2532 4

end

这个结果很容易对人造成误解,让人不明白代码的执行顺序,

简要分析一下代码的执行过程:

1、首先执行print('start',os.getpid())这里可以看出来主进程就是1188

2、进入for循环,首先执行print(os.getpid())

然后创建第一个子进程,然后执行print('------------------')然后执行
p.start()
第一个进程开始跑起来
然后执行print('...............')到这里,第一次循环结束
(这里有人就奇怪了,为什么从结果上看是for循环里面输出语句打印完了子进程的输出语句才打印呢?

这里我认为是子进程去调用函数run_process的时间比主进程跑for循环的时间要长很多的原因,

为了验证这个猜想,可以将for循环语句调成循环20次及以上,观察打印结果就会明白,这时候就会发现其实主进程跑的过程中子进程也在跑了。这也就说明上面的流程是没有问题的。

并且你会发现代码中注释了一句time.sleep(1),如果你去掉注释,加入这条语句,让主进程休息一秒钟,这时候你会发现子进程的打印结果就会出现在print('...............')语句之前了。)

当然最后输出end的原因是因为p.join()语句的存在,它使得等所有子进程都执行完毕之后再接着运行主进程

不信的话你试试去掉这条语句,看看end会出现在哪个地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息