并发编程

发布时间 2023-07-06 15:45:40作者: Meeeoww

进程概念

# 进程是一个比较抽象的概念,进程和线程的使用都是有操作系统来调度的

场景比喻:
'''
厨师做饭,厨师按照菜谱来做菜,那么,菜谱就是程序,而做饭的过程就是进程,在这个过程中,厨师就是线程,线程才是真正干事情的,做饭的过程中可以有多个干事的人,其实背后就是在一个进程中,可以有多个线程
'''
进程和程序的区别:
程序:就是一堆代码,没有生命周期;进程是一个过程,而不是过程中做事的人
进程:是动态,有生命周期


进程与线程的关系:先开进程,在进程里面开线程,一个进程中可以有多个线程,一个进程中至少要有一个线程



# 协程:单线程下的并发,比线程还要小,如果开协程,那么,消耗的资源更小
进程  >>>   线程  >>> 协程(程序员调度的)


补充:
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类,其实又拉起了一个解释器,然后去执行代码
'''
  • 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
"""
  • Process类中的方法
"""
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')