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

本文探讨了Python的multiprocessing模块中Process类的使用,通过实例分析了多进程执行的顺序和原理。在代码示例中,主进程与子进程的输出顺序可能引起误解,但实际上是由于子进程执行时间较长导致的现象。加入time.sleep(1)或移除p.join()可验证执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 关于多进程的一些理解

#利用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会出现在哪个地方。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值