【python进阶】深入理解系统进程1
前言
之前程序执⾏都是⼀条腿⾛路,甚⾄是⽤⼀杆枪来打天下。
通过系统编程的学习,会让⼤家有“多条腿”⼀起⾛路,就好⽐有了⼀把机关枪。
此篇为深入理解进程第一篇,下面开始今天的说明~~~
多任务的引入
现实生活中
有很多的场景中的事情是同时进⾏的,⽐如开⻋的时候⼿和脚共同来驾驶汽⻋,再⽐如唱歌跳舞也是同时进⾏的;
如下视频是:迈克杰克逊的⼀段视频:
http://v.youku.com/v_show/id_XMzE5NjEzNjA0.html
试想,如果把唱歌和跳舞这2件事情分开依次完成的话,估计就没有那么好的效果了(想⼀下场景:先唱歌,然后在跳舞,O(∩_∩)O哈哈~)
程序中
如下程序,来模拟“唱歌跳舞”这件事情
from time import sleep def sing(): for i in range(3): print("正在唱歌...%d"%i) sleep(1) def dance(): for i in range(3): print("正在跳舞...%d"%i) sleep(1) if __name__ == '__main__': sing()#唱歌 dance()#跳舞
运行结果如下:
!!!注意:
- 很显然刚刚的程序并没有完成唱歌和跳舞同时进⾏的要求
- 如果想要实现“唱歌跳舞”同时进⾏,那么就需要⼀个新的⽅法,叫做:多任务
多任务的概念
什么叫“多任务”呢?简单地说,就是操作系统可以同时运⾏多个任务。打个⽐⽅,你⼀边在⽤浏览器上⽹,⼀边在听MP3,⼀边在⽤Word赶作业,这就 是多任务,⾄少同时有3个任务正在运⾏。还有很多任务悄悄地在后台同时运⾏着,只是桌⾯上没有显示⽽已。
现在,多核CPU已经⾮常普及了,但是,即使过去的单核CPU,也可以执⾏多任务。由于CPU执⾏代码都是顺序执⾏的,那么,单核CPU是怎么执⾏多任务的呢?
答案就是操作系统轮流让各个任务交替执⾏,任务1执⾏0.01秒,切换到任务2,任务2执⾏0.01秒,再切换到任务3,执⾏0.01秒……这样反复执⾏下去。 表⾯上看,每个任务都是交替执⾏的,但是,由于CPU的执⾏速度实在是太快了,我们感觉就像所有任务都在同时执⾏⼀样。
真正的并⾏执⾏多任务只能在多核CPU上实现,但是,由于任务数量远远多 于CPU的核⼼数量,所以,操作系统也会⾃动把很多任务轮流调度到每个核⼼上执⾏。
进程的创建-fork
1. 进程 VS 程序
编写完毕的代码,在没有运⾏的时候,称之为程序
正在运⾏着的代码,就成为进程
进程,除了包含代码以外,还有需要运⾏的环境等,所以和程序是有区别的。
2. fork( )
Python的os模块封装了常⻅的系统调⽤,其中就包括fork,可以在Python程 序中轻松创建⼦进程:
import os # 注意:fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() if pid == 0: print('哈哈1') else: print('哈哈2')
运行结果:
说明:
- 程序执⾏到os.fork()时,操作系统会创建⼀个新的进程(⼦进程),然后复制⽗进程的所有信息到⼦进程中
- 然后⽗进程和⼦进程都会从fork()函数中得到⼀个返回值,在⼦进程中这 个值⼀定是0,⽽⽗进程中是⼦进程的id号
在Unix/Linux操作系统中,提供了⼀个fork()系统函数,它⾮常特殊。
普通的函数调⽤,调⽤⼀次,返回⼀次,但是fork()调⽤⼀次,返回两次,因 为操作系统⾃动把当前进程(称为⽗进程)复制了⼀份(称为⼦进程),然 后,分别在⽗进程和⼦进程内返回。
⼦进程永远返回0,⽽⽗进程返回⼦进程的ID。
这样做的理由是,⼀个⽗进程可以fork出很多⼦进程,所以,⽗进程要记下 每个⼦进程的ID,⽽⼦进程只需要调⽤getppid()就可以拿到⽗进程的ID。
3. getpid()、getppid()
import os rpid = os.fork() if rpid<0: print("fork调用失败。") elif rpid == 0: print("我是子进程(%s),我的父进程是(%s)"%(os.getpid(),os.getppid())) x+=1 else: print("我是父进程(%s),我的子进程是(%s)"%(os.getpid(),rpid)) print("父子进程都可以执行这里的代码")
运⾏结果:
多进程修改全局变量
import os import time num = 0 #注意:fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() if pid == 0: num+=1 print("哈哈1---num=%d"%num) else: time.sleep(1) num+=1 print("哈哈2---num=%d"%num)
运行结果:
总结:
多进程中,每个进程中所有数据(包括全局变量)都各有拥有⼀份,互不影响
多次fork问题
如果在⼀个程序,有2次的fork函数调⽤,是否就会有3个进程呢?
import os import time # 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() if pid == 0: print('哈哈1') else: print('哈哈2') pid = os.fork() if pid == 0: print('哈哈3') else: print('哈哈4') time.sleep(1)
运行结果:
说明:
⽗⼦进程的执⾏顺序
⽗进程、⼦进程执⾏顺序没有规律,完全取决于操作系统的调度算法
您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx.
微信打赏
支付宝打赏
作 者: Angel_Kitty
出 处:http://www.cnblogs.com/ECJTUACM-873284962/
关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
5月9日云栖精选夜读丨阿里量子实验室研制出全球最强量子电路模拟器“太章”;超强干货一文综述人脸检测算法
5月8日,阿里巴巴量子实验室施尧耘团队宣布于近日成功研制当前世界最强的量子电路模拟器,名为“太章”。同日,巴基斯坦电商公司Daraz宣布被阿里巴巴集团全资收购。超强干货一文综述人脸检测算法......更多详情尽在今日云栖夜读! 热点热议 阿里巴巴量子实验室宣布研制出全球最强量子电路模拟器“太章” 5月8日,阿里巴巴量子实验室施尧耘团队宣布于近日成功研制当前世界最强的量子电路模拟器,名为“太章”。 基于阿里巴巴集团计算平台在线集群的超强算力,“太章”在世界上率先成功模拟了81(9x9)比特40层的作为基准的谷歌随机量子电路,之前达到这个层数的模拟器只能处理49比特 阿里全球化又有大动作:全资收购南亚电商平台Daraz 5月8日,巴基斯坦电商公司Daraz宣布被阿里巴巴集团全资收购,正式成为阿里巴巴大家庭的一员。这标志着南亚市场进一步成为阿里巴巴全球化发展战略的一个重要组成部分。 Daraz成立于2012年,由英国政府发展金融机构旗下侧重支持和发展非洲和南亚商业的CDC集团,以及位于新加坡的亚太互联网集团(APACIG)拥有。 一文综述人脸检测算法(附资源) 人脸检测是目前所有目标检测子方...
- 下一篇
python-批量添加图片水印
前言: 最近总是被无良公众号和培训机构拷贝文章,他们根本不会给你备注原文出处,这种行为真的让人不高兴,所以计划以后的文章都添加上自己的水印。 话不多说,直接上代码。 一、单张图片添加文字水印 # -*- coding: utf-8 -*- # @Time : 2018/5/9 上午11:31 # @Author : xiaoxi # @File : watermark.py from PIL import Image from PIL import ImageDraw from PIL import ImageFont imageFile = "/Users/截图图库/1.jpg" im = Image.open(imageFile) font = ImageFont.truetype('/Library/Fonts/Songti.ttc', 26) font1 = ImageFont.truetype('/Library/Fonts/Zapfino.ttf', 16) draw = ImageDraw.Draw(im) draw.text((im.size[0]-330, im.si...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS关闭SELinux安全模块
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器