#利用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())
这里可以看出来主进程就是11882、进入for循环,首先执行
print(os.getpid())
然后创建第一个子进程,然后执行
print('------------------')
然后执行p.start()
第一个进程开始跑起来
然后执行
print('...............')
到这里,第一次循环结束(这里有人就奇怪了,为什么从结果上看是for循环里面输出语句打印完了子进程的输出语句才打印呢?
这里我认为是子进程去调用函数run_process的时间比主进程跑for循环的时间要长很多的原因,
为了验证这个猜想,可以将for循环语句调成循环20次及以上,观察打印结果就会明白,这时候就会发现其实主进程跑的过程中子进程也在跑了。这也就说明上面的流程是没有问题的。
并且你会发现代码中注释了一句time.sleep(1),如果你去掉注释,加入这条语句,让主进程休息一秒钟,这时候你会发现子进程的打印结果就会出现在print('...............')语句之前了。)
当然最后输出end的原因是因为p.join()语句的存在,它使得等所有子进程都执行完毕之后再接着运行主进程
不信的话你试试去掉这条语句,看看end会出现在哪个地方。