目录
一、多任务
1.1定义
多任务是指在同⼀时间内执行多个任务
1.2具体体现
多核处理器:真正并行执行多个任务,每个核心处理不同进程
CPU时间片轮转:操作系统快速切换执行不同程序,给用户同时运行多个程序的感觉
文档编辑器实时保存文件同时进行拼写检查
浏览器同时加载多个网页标签
1.3并发和并行
多任务的两种表现形式:并发和并行
1.3.1并发操作
指多个任务在同一时间段内交替执行,通过任务切换实现同时处理多个任务的效果。在单核CPU上也可以实现并发。

1.3.2并行操作
指多个任务真正同时执行,需要多个处理单元(如多核CPU)来实现,每个任务在不同的处理单元上同时运行。

1.3.3对比

二、进程
2.1概念
是计算机中正在运行的程序的一个实例,是操作系统进行资源分配和调度的基本单位。
2.2特点
独立性:每个进程都有独立的内存空间和系统资源
动态性:进程是程序的一次执行过程,具有生命周期
并发性:多个进程可以同时存在于系统中并并发执行
异步性:进程按各自独立的、不可预知的速度向前推进
2.3进程状态

2.4多进程
python
def fun_a():
print('进行程序a')
def fun_b():
print('进行程序b')
fun_a()
fun_b()
当我们需要执行上面代码中的两个任务进程的时候,同时进行可以大大增加效率
现在的进程执行顺序:

采用多进程:

2.5多进程实现
1.导入进程multiprocessing包
2.通过进程类创建进程对象:进程对象 = multiprocessing.Process()
3. 启动进程执⾏任务:进程对象.start()
代码实现:
python
# 导⼊多进程模块,⽤于创建和管理进程
import multiprocessing
# 导⼊时间模块,⽤于实现计时功能
import time
def music():
for i in range(3):
print('听⾳乐...')
time.sleep(0.2)
def coding():
for i in range(3):
print('敲代码...')
time.sleep(0.2)
if __name__ == '__main__':
# 创建⼀个进程,⽤于执⾏名为music的函数
music_process = multiprocessing.Process(target=music)
# 创建另⼀个进程,⽤于执⾏名为coding的函数
coding_process = multiprocessing.Process(target=coding)
# 启动music进程,使其开始执⾏
music_process.start()
# 启动coding进程,使其开始执⾏
coding_process.start()
由于是交替执行,无序,所以控制台输出的时候可能并不像我们想要的结果那样一一交替运行,比如:

2.6进程锁
我们可以通过进程锁,来管理运行的权力,规定将运行的职权给一个功能后,进行堵塞,必须等待其运行完才能将运行的权利交给下一个功能
python
# 导⼊多进程模块,⽤于创建和管理进程
from multiprocessing import Process, Lock
# 导⼊时间模块,⽤于实现计时功能,导入进程锁,将程序运行进行阻塞
lock = Lock()
import time
def music():
for i in range(3):
with lock:
print('正在播放音乐...')
time.sleep(0.2)
def coding():
for i in range(3):
with lock:
print('敲代码...')
time.sleep(0.2)
if __name__ == '__main__':
# 创建⼀个进程,⽤于执⾏名为music的函数
music_process = Process(target=music)
# 创建另⼀个进程,⽤于执⾏名为coding的函数
coding_process = Process(target=coding)
# 启动music进程,使其开始执⾏
music_process.start()
# 启动coding进程,使其开始执⾏
coding_process.start()
此时多次运行测试发现,运行结果一致都是一一交替运行:

三、线程
3.1概念
线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。
3.2特点
- 轻量级
--线程是比进程更小的执行单位
--创建和切换开销比进程小得多
- 共享资源
--同一进程内的线程共享内存空间、文件句柄等资源
--线程间通信比进程间通信更高效
- 独立执行
--每个线程有独立的执行路径
--拥有独立的栈空间和寄存器状态
- 并发执行
--多个线程可以并发执行
--提高程序执行效率和响应性
- 同步需求
--多线程访问共享资源时需要同步机制
--需要考虑线程安全问题
3.3适用场景
- I/O密集型任务
文件读写、网络请求等I/O操作
当一个线程等待I/O时,其他线程可以继续执行
- 并行计算
CPU多核环境下可实现真正的并行处理
大量独立计算任务的并行执行
- 用户界面应用
提高UI响应性,避免界面卡顿
后台任务与UI线程分离
- 服务器应用
处理多个客户端并发请求
Web服务器、数据库服务器等
- 实时系统
需要同时处理多个实时任务的场景
定时任务、监控系统等
3.4多线程实现
python
# 导⼊time模块和threading模块
import time
import threading
# 定义⼀个播放⾳乐的函数
def music():
# 循环三次,每次打印听⾳乐的状态并暂停0.2秒
for i in range(3):
print('听⾳乐...')
time.sleep(0.2)
# 定义⼀个编码的函数
def coding():
# 循环三次,每次打印敲代码的状态并暂停0.2秒
for i in range(3):
print('敲代码...')
time.sleep(0.2)
# 程序⼊⼝
if __name__ == '__main__':
# 创建⼀个线程,⽤于播放⾳乐。通过threading.Thread类创建线程,music函数作为线程
# 要执⾏的⽬标。
music_thread = threading.Thread(target=music)
# 创建⼀个线程,⽤于编码⼯作。同样使⽤threading.Thread类创建,coding函数作为线
# 程序要执⾏的⽬标。
coding_thread = threading.Thread(target=coding)
# 启动⾳乐线程和编码线程
music_thread.start()
coding_thread.start()
# 等待⾳乐线程完成其任务
music_thread.join()
# 等待编码线程完成其任务
coding_thread.join()
print('程序结束')
四、对比
4.1关系对⽐
① 线程是依附在进程⾥⾯的,没有进程就没有线程。
② ⼀个进程默认提供⼀条线程,进程可以创建多个线程
4.2区别对⽐
① 进程之间不共享全局变量
② 线程之间共享全局变量
③ 创建进程的资源开销要⽐创建线程的资源开销要⼤
④ 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
4.3优缺点
① 进程优缺点:
优点:可以⽤多核
缺点:资源开销⼤
② 线程优缺点
优点:资源开销⼩
缺点:不能使⽤多核