关于Python2/3多进程的一些个人理解
来源:互联网 发布:网络维修工 编辑:程序博客网 时间:2024/06/07 13:11
#利用multiprocessing模块里面的Process类(这里无论是Python2还是3都是如此)
from multiprocessing import Processimport time,osdef 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会出现在哪个地方。
- 关于Python2/3多进程的一些个人理解
- 关于线程和父子进程的一些个人理解
- 关于KMP的一些个人理解
- 关于socket的一些个人理解
- 关于Myeclipse调试的一些个人理解
- 关于大数据的一些个人理解
- 关于WebRtc的一些个人理解
- 关于线程方法的一些个人理解
- Python点滴01——关于Python2.x和3.x的一些个人感受
- 关于计算机操作系统的进程线程的个人看法理解
- 关于内核中spinlock的一些个人理解
- 【原创】关于操作符重载的一些个人理解
- 关于C#中 out/ref的一些个人理解
- 关于Volatile关键字含义的一些个人理解
- 关于onMeasure ()和onLayout()的一些个人理解
- 关于事件与委托的一些个人简单理解
- 关于Bean\Entity\Model\POJO的一些个人理解
- 进程的一些理解
- Qt中利用Qwt画动态正弦曲线,并可动态调整振幅和周期
- mysql常用的备份命令与备份策略
- 在Github上创建一个项目代码仓库
- 微服务架构日志集中化 安装 EFK (Fluentd ElasticSearch Kibana) 采集nginx日志
- Snackbar使用详解
- 关于Python2/3多进程的一些个人理解
- IntelliJ IDEA新建Gradle项目启动404
- python 包和导入模块
- Android RxJava 操作符详解系列:过滤操作符
- 使用Axis2方式发布webService的三种方式
- 机器学习之K均值算法
- android其实很简单--内存相关
- 频谱仪原理与重要指标的作用
- 为什么要使用href="javascript:void(0);"