进程概念
# 进程是一个比较抽象的概念,进程和线程的使用都是有操作系统来调度的
场景比喻:
'''
厨师做饭,厨师按照菜谱来做菜,那么,菜谱就是程序,而做饭的过程就是进程,在这个过程中,厨师就是线程,线程才是真正干事情的,做饭的过程中可以有多个干事的人,其实背后就是在一个进程中,可以有多个线程
'''
进程和程序的区别:
程序:就是一堆代码,没有生命周期;进程是一个过程,而不是过程中做事的人
进程:是动态,有生命周期
进程与线程的关系:先开进程,在进程里面开线程,一个进程中可以有多个线程,一个进程中至少要有一个线程
# 协程:单线程下的并发,比线程还要小,如果开协程,那么,消耗的资源更小
进程 >>> 线程 >>> 协程(程序员调度的)
补充:
CPU的工作机制:
1. 当遇到i/o阻塞的时候,会自动剥夺CPU的执行权限
2. 当CPU遇到占用时间过长的任务时候,也会剥夺执行权限
'''CPU的工作其实是来回切换的!!!!'''
i/o密集型
遇到阻塞,不会一直占用CPU资源,需要等待。比如:sleep状态
计算密集型
没有遇到阻塞,会大量的占用CPU资源,也不需要等待
1、先来先服务
2、短作业优先(短时间优先)
3、时间片轮转
4、多级反馈队列
"""操作系统会自行选择哪一种算法"""
并行和并发的概念
1、并行:
在同一时间,执行多个任务,多个进程同时执行,就是多个cpu一起干活,单个cpu无法实现
2、并发:
在一段时间内,执行多个任务,多个进程看起来像同时执行,事实上不是同时执行
这个过程就是让CPU在对个程序之间利用多道技术来回切换+保存状态
'''单核CPU不能实现并行操作,一个单核CPU同一时刻只能执行一个任务,多核的CPU,4核,同一时刻,可以执行4个任务,CPU的最大利用率'''
#高并发和高并行
1、高并发: 就是程序能够支持几个亿的并发量
就是这几个亿的用户来到可以感受到自己被服务着的意思 eg: 12306
2、高并行: 写的软件可以支持几个亿的并行(当然我们还是无法实现)
支持几个亿的并行,就代表这个计算机要有几个亿的CPU
同步异步阻塞非阻塞
#同步异步同步:依赖于上一步的结果,持续等待上一次返回的结果,提交完任务之后会在原地等待任务的返回结果,在等待的过程不会做任何事。异步:不依赖于上一步的结果,提交完任务之后 不原地等待,去干别的事情,有结果自动通知#阻塞非阻塞阻塞:进程的三状态中的阻塞态。任务有IO操作时就会进入非阻塞:就绪态和运行态"""同步异步:用来描述任务的提交方式阻塞非阻塞: 用来描述任务的执行状态"""同步+阻塞: 银行排队办理业务,期间不做任何事,干等着同步+非阻塞: 银行排队办理业务,期间可以去做一些其他的事,但是人还在办理业务的队列中 异步阻塞: 在椅子上坐着,不做任何事异步非阻塞: 在椅子上面坐着,在期间喝水、吃东西、工作、玩手机、、(这个过程就是把程序运行到了极致) #效率 1. 同步阻塞 ---------------> 效率最低2. 同步非阻塞3. 异步阻塞4. 异步非阻塞----------------> 效率最高"""如果想要提高程序被执行效率就要程序一直处于就绪态和运行态"""
开启进程
在python中使用内置模块Process类,实例化这个类得到一个进程对象,开进程的目的是为了执行任务
from multiprocessing import Process
def write_file():#子进程
with open('a.txt', 'w', encoding='utf-8') as f:
f.write('helloworld')
# 在Windows系统中,开启进程必须写在__main__判断里面
if __name__ == '__main__':
p = Process(target=write_file) # 实例化得出一个对象,target=目标任务
#p = Process(target=write_file())#这里目标任务不能这么写,加括号等于执行函数的返回结果
p.start() # 调用Process类start方法通知操作系统去开进程
'''
一个py文件不一定是一个进程,python运行在解释器之上,一个解释器就是一个进程,
在python中,调用Process类,其实又拉起了一个解释器,然后去执行代码
'''
"""
参数:target:指定执行的任务名
name:修改进程名称
args:位置传参 args=(1,)元组类型,括号不能省略
kwargs:关键字传参
属性:name:查看进程名,默认进程名Process-1
pid:查看进程号
daemon:守护进程
"""
from multiprocessing import Process
def task(*a,age,gender):
print(a)
print(age)
print(gender)
if __name__ == '__main__':
p=Process(target=task,args=(1,23,4),name='nn',kwargs={'age':18,'gender':'female'})
p.daemon=True#把p进程设置为守护进程,主进程代码执行完毕 子进程立马结束,且必须写在start方法之前
p.start()
print('进程名为:%s'%p.name)
print('进程号为:%s' %p.pid)
"""output
进程名为:nn
进程号为:21100
(1, 23, 4)
18
female
"""
"""
terminate()杀死进程
is_alive()判断进程是否存活
join()等待子进程执行完毕再执行主进程
"""
from multiprocessing import Process
def write_file(a, b, c, name, age):
print('a:', a)
import time
time.sleep(3)
if __name__ == '__main__':
p = Process(target=write_file, name='ly', args=(1, 2, 3), kwargs={'name': 'ly', 'age': 20}) # 实例化得出一个对象
p.start()
print(p.is_alive()) # 查看进程否存活
'''terminate()通知操作系统去杀死进程,操作系统去杀进程需要有一段时间,不会立马杀掉'''
p.terminate() #杀死进程,相当于在任务管理器结束进程
# import time
# time.sleep(0.1)
print(p.is_alive()
p.join()# 子进程先执行完毕,主进程再执行
print('end')