前言
一些关于python学习中对进程的概念和方法的总结,欢迎补充和讨论。
一、进程的概念
进程是操作系统分配资源的最小单位
进程是正在运行的程序的实例
二、进程的状态
就绪态、运行态、阻塞态
在Linux里面进程的状态还有其他分类 后面会进行补充
三、进程的并行与并发
并行指的是在某一瞬间,同时执行多个任务
并发是指一段时间 执行多个任务 高并发就是指尽可能执行多个任务
四、进程的同步异步阻塞与非阻塞
- 同步阻塞形式
- 效率最低。就是你专心排队,什么别的事都不做。
- 异步阻塞形式
- 如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
- 异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
- 同步非阻塞形式
- 实际上是效率低下的。
- 想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
- 异步非阻塞形式
- 效率更高
- 因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。
- 比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
!!!很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞。
五、multiprocess模块:
创建进程部分
from multiprocessing import Process
一种方式调用函数的形式 直接创建子进程
一种通过类的继承的方式来创建子进程(感兴趣的小伙伴可以查找一下具体案例)
p.start():开始执行子进程
p.join():让主进程等待子进程执行结束再继续
p.terminate():关闭进程不一定立刻关闭
p.is_alive():查看一个进程是否还是活跃状态
p.pid:查看进程的id号
p.getid():查看子进程的进程id
p.getppid():查看父进程id
p.dameon=True:设置进程为守护进程
-
关于守护进程
当主进程运行结束的时候,子进程就会终止
通过p.dameon=True:可以设置子进程为守护进程 但是必须在p.start之前设置其为守护进程
在linux当中也有很多守护进程,他们的父进程都是systemd进程,而systemd进程是开机启动的第一个进程,所以可以达到一种效果:守护进程一直不会被终止
进程锁
当多个进程操作同一份数据时会产生数据安全问题 可以通过对应用加锁的形式来保证数据安全问题 但是会在一定程度上牺牲多进程并发的效率。
lock=Lock():创建一个锁
lock.acquire():锁住下方代码
lock.release():释放上方被锁住的代码
进程之间数据共享
进程数据隔离问题
进程与进程之间的数据是互相隔离的,那么进程和进程之间如何通信交换数据呢?可以使用队列的方式
from multiprocessing import Queue
q=Queue(3)
#创建一个长度为3的队列
q.put(item)
#往队列里面添加元素,当队列已满时,此语句会阻塞
q.get()
#从元素中取数据,当队列为空时会阻塞
q.put_nowait(3)
向队列中添加元素 如果队列已满时会不等待 会报错 最好有异常处理
q.full()
#判断是否已满
q.empty()
#判断是否为空
进程池
进程在创建和销毁时 都会占用一定的系统开销 当我们创建成千上万个进程的时候反而会导致效率低
进程池的设计则是在最开始的时候创建好进程,然后不断的通过进程池里的进程执行任务即可,可以节约进程创建和销毁的开销
总结
以上就是关于进程的部分比较重点的内容,本文仅仅简单介绍了进程和python结合的一些小知识,感兴趣的小伙伴可以把想要分享的知识留言在下方。