进程概念
进程、线程都是操作系统中的基本概念,也就是说进程和线程都是操作系统层面的东西,专业术语表达就是进程和线程的使用都是有操作系统来调度的,而不是由我们程序员自己来操控的
在操作系统课程里,进程和线程都是操作系统的概念,协程不是操作系统中的概念,而是我们程序员层面的
协程是由我们程序员自己来调用的,不是由操作系统来调用的,也就是说,在操作系统中没有协程这个概念
进程是用来干什么的:
进程可以用来做任务,比如听歌、看视频等
-
什么是进程?
-
比如:
厨师做饭,厨师按照菜谱来做菜,那么菜谱就是程序,而做 饭的过程就是进程,在这个过程,厨师就是线程,所以,厨师才是真 正做事的,言外之意线程才是真正干活的,而进程不是,进程只是一 个过程
进程和程序的区别
- 程序就是一堆死的东西,没有生命周期
- 进程是有生命周期的,当一个任务进行完毕之后,进程就不存在了
进程中要是有线程的,进程中如果没有线程是没有意义的,一个进程中是可以有多个线程的,一个进程中至少要有一个线程
进程和线程都是有操作系统来调度的
进程是操作系统的一个独立单位
-
补充:CPU的工作机制
- 1.当CPU遇到 I/O操作的时候,会剥夺CPU的执行权限
- 2.当遇到的任务需要占用大量时间的时候,也会剥夺执行权限
其实CPU的工作机制是来回切换做到的
I/O密集型
input output
遇到阻塞,但是不需要占用大量的CPU资源,需要等待,比如slepp
计算密集型
没有遇到阻塞,但是需要占用大量的CPU资源,也不需要等待
操作系统的调度算法
- 先来先服务调度算法
- 短作业优先调度算法
- 时间片轮转法
- 多级反馈队列
操作系统会自动选择哪一种算法
进程的并发和并行
并行:在同一时刻,同时执行任务
CPU是有多个核的,单核的,多核的
单核的CPU能不能做到并行?
做不到的
在同一时刻想要执行多个任务,必须要求CPU有多个处理器
并发:在一段时间内,看起来都是同时执行的任务,事实上,不是同一时刻
同步异步阻塞非阻塞
同步:依赖于上一次的结果
异步:不依赖于上一次的结果
异步的效率肯定是比不的效率高
如何开启进程
使用的是内置模块:multiprocess
开始进程模板
# 1.导入模块
from multiprocessing import Process
# 2.设置函数
def task():
pass
# 在windows系统中必须写,其他其他不用
if __name__ == '__main__':
# 3.实例化
p = Process(target=task)
# 4.开启进程
p.start()
Process参数
实例化的时候得到一个对象,p.start()
的时候也只是通知操作系统去开进程,所以在一瞬间进程并没有开起来
以下参数都是在实例化作为实参传入进程的,默认值都是None
1.name
每个一个进程都有:进程名,进程id等苏醒
name:代表的是进程的名字
如何查看一个进程的名字?
p.name
就是进程的名字
2.args=()
需进程的函数中所需的参数按照位置参数传入
3.kwargs = {}
需进程的函数中所需的参数按照关键字参数传入
方法介绍
将进程实例化之后的一些常用的方法
1.daemon
这个是写在实例化之后、进程运行前的,作用是守护进程,就是让主进程的代码先执行,然后执行子进程的代码,并且主进程代码执行完毕后,子进程的代码并没有结束
p.daemon()
2.terminate
杀死进程,将进程强行关闭p.terminate()
3.is_alive
查看进程是否还存活p.is_alive( )
4.join
先等子进程中的代码运行结束,再进行主进程的代码p.join()
实现多进程
from multiprocessing import Process
def a():
pass
if __name__ == 'main':
lst = []
for i in range(3):
p = Process(target=a)
p.start()
lst.append(p)
for i in lst:
i.join()
print(123) # 所有的进程结束之后才会执行
进程锁
所有锁的作用都是为了保证数据的安全
进程锁就是当遇到一个进程有锁时会先等待这个进程结束后再进行下一个进程
import time
def task(i, lock):
# 上一把锁
lock.acquire()
print("第%s个进程进来了" % i)
print("第%s个进程走了" % i)
time.sleep(1)
# 释放锁
lock.release()
from multiprocessing import Process
from multiprocessing import Lock
if __name__ == '__main__':
lock = Lock()
for i in range(5):
# 将锁传入运行进程的函数里
p = Process(target=task, args=(i, lock))
p.start()
进程间的通信(IPC机制)
进程是可以开启多个的,进程与进程之间是相互独立的,互不影响,进程是操作系统的一个独立的单元
一个进程崩了,其他进程不受影响
在一个进程中不能修改另一个进程的数据,言外之意是进程之间的数据都是隔离的,互不影响
要想在一个进程中使用另外一个进程中的数据,需要让进程之间通信(IPC)