一、回顾
1、编程语言的发展
机器语言:二级制
汇编语言:指令,命令形式
高级语言:面向过程(C),面向对象(python)
2、操作系统的目标:
为了用户更方便的使用。
3、并行与并发:
并行:指两件或多件事情,在同一时间点同时执行
并发:指两件或多件事情,在同一时间间隔内同时执行
4、计算机组成
CPU,主板,存储,输入,输出
5、进程由三部分组成
代码段、数据段、PCB(进程控制块)
6、进程的三个基本状态
就绪状态:获得了除CPU之外运行需要的所有资源
执行状态:获得了所有资源,处于正在执行的状态
阻塞状态:因为各种原因,导致进程放弃了CPU,导致进程无法继续执行,此时进程处于内存
7、为什么要有操作系统?
(1)封装了所有硬件的接口,使用户更方便的使用
(2)对于计算机内所有资源,进行一个合理的调度和分配
二、进程学习
1、进程三状态转换图
2、同步与异步
所谓同步就是一个任务需要依赖另一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要目成功都成功,失败都失败,两个任务的状态可以保持一致。
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。
3、同步/异步与阻塞/非阻塞
(1)同步阻塞形式
(2)异步阻塞形式
(3)同步非阻塞形式
(4)异步非阻塞形式
4、多进程的开启
(1)如何开启多个不同的子进程?
1 from multiprocessing import Process 2 import time 3 import os 4 5 6 def func(n): 7 time.sleep(2) 8 print('这里是儿子%s进程,儿子的pid是:%s,父进程的pid是:%s' % (n,os.getpid(),os.getppid())) 9 10 if __name__ == '__main__': 11 for i in range(2): 12 p = Process(target=func,args=(i,)) # 实例化一个进程对象 13 p.start() # 开启进程 14 print('这里是父亲的进程,父亲的pid是:%s'% (os.getpid())) 15 16 ''' 17 这里是父亲的进程,父亲的pid是:26920 18 这里是儿子0进程,儿子的pid是:14480,父进程的pid是:26920 19 这里是儿子1进程,儿子的pid是:21424,父进程的pid是:26920 20 '''
(2)以继承的方式开启子进程
1 # *******************以继承的方式开启子进程**********************开始 2 from multiprocessing import Process 3 4 class MyProcess(Process): 5 def __init__(self,name): 6 self.name = name 7 super(MyProcess,self).__init__(name=self.name) 8 9 def run(self): 10 print("这是以继承类的方式开启的子进程,他的名字是:%s" % self.name) 11 12 if __name__ == '__main__': 13 p = MyProcess('alex')# 实例化一个进程对象 14 p.start() # 指解释器告诉操作系统,去帮我开启一个进程 就绪状态 15 # p.run() # 告诉操作系统,现在马上帮我执行这个子进程 执行状态 16 # *******************以继承的方式开启子进程**********************结束
【注意】开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束。
【注意】p.join( )的作用,主进程执行这个,就会变成同步形式;若不执行这个,就是异步形式。
join( )必须放在start后面。
1 p = MyProcess('alex')# 实例化一个进程对象 2 p.start() # 指解释器告诉操作系统,去帮我开启一个进程 就绪状态 3 p.join() # 是让主进程等待子进程执行完毕。 4 time.sleep(1) 5 print('粑粑在这里')
5、进程的其他常用
1 from multiprocessing import Process 2 import time 3 4 def func(): 5 time.sleep(1) 6 print(123) 7 8 if __name__ == '__main__': 9 p = Process(target=func,) 10 p.start() 11 p.terminate()# 杀死p进程,让解释器告诉操作系统,请杀掉p进程。 12 print('子进程是否还活着?', p.is_alive()) 13 time.sleep(0.002) 14 print('子进程是否还活着?', p.is_alive()) 15 # 返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程死了 16 17 # p.is_alive() 判断p进程是否还活着 18 # p.terminate() 杀死p进程
6、进程的常用属性
(1)守护进程:将子进程设置为守护进程,主进程结束后,子进程也随之结束。
1 from multiprocessing import Process 2 import time 3 4 def func(): 5 time.sleep(100) 6 print('这里是儿子哦') 7 8 if __name__ == '__main__': 9 p = Process(target=func) 10 p.daemon = True # 将p进程设置为守护进程,必须要在start之前设置 11 p.start() 12 time.sleep(1) 13 print('这是爸爸') 14 总结一下: 15 守护进程:跟随着父进程的代码执行结束,守护进程就结束
守护进程的用法:(计时)
1 from multiprocessing import Process 2 import time 3 4 5 def func(): 6 for i in range(10): 7 time.sleep(1) 8 print(time.strftime('%H:%M:%S')) 9 10 if __name__ == '__main__': 11 p = Process(target=func) 12 p.daemon = True # 将p进程设置为守护进程,必须要在start之前设置 13 p.start() 14 time.sleep(5) 15 print('这是爸爸')
(2)常用属性
1 from multiprocessing import Process 2 import os 3 4 def func(): 5 print('这里是儿子,儿子的pid是%s'%(os.getpid())) 6 7 if __name__ == '__main__': 8 p = Process(target=func) 9 p.start() 10 p.name = 'alex' 11 print('儿子的名字是%s'%p.name) 12 print('儿子的pid是%s'%p.pid) 13 print('儿子是不是守护进程?',p.daemon)
7、总结
(1)进程的两种开启方法
① p = Process(target=None,args(,))
② 自定义类,继承Process父类
(2)进程的常用方法
① start() 开启一个进程
② join() 异步变同步
③ is_alive() 判断进程是否活着
④ terminate() 杀死进程
(3)进程的常用属性
① p.name= 给进程一个名字
② p.pid 返回p进程的pid
③ p.daemon=True 将p进程设置为守护进程。
守护进程两个特点:
守护进程会随着父进程的iehu而结束;
守护进程不能在创建子进程。
8、多个子进程演示
1 from multiprocessing import Process 2 import time 3 import random 4 5 def func(i): 6 print('我是%s'%i) 7 8 9 if __name__ == '__main__': 10 l = [] 11 addr = ['河南的','山东的','辽宁的','湖南的'] 12 for i in addr: 13 p = Process(target=func,args=(i,)) 14 p.start() 15 # p.join() 16 l.append(p) 17 [p.join() for p in l] 18 time.sleep(1) 19 print('我选%s'%(random.choice(addr)))