多任务编程
多任务是指在同一时间内执行多个任务,例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。
- 并发:在一段时间内交替去执行任务
- 并行:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。这里需要注意多核cpu是并行的执行多任务,始终有多个软件一起执行。
进程
- 一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
- 一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。
- 导入进程包
import multiprocessing
创建子进程并指定执行的任务
sub_process = multiprocessing.Process (target=任务名)
启动进程执行任务
sub_process.start() - 获取当前进程编号
os.getpid()
获取当前父进程编号
os.getppid()
获取进程编号可以查看父子进程的关系 - 进程的注意点介绍
1.进程之间不共享全局变量
2.主进程会等待所有的子进程执行结束再结束
线程
- 线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度 ,也就是说线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
- 导入线程模块
import threading
创建子线程并指定执行的任务
sub_thread = threading.Thread(target=任务名)
启动线程执行任务
sub_thread.start() - 线程的注意点介绍
线程之间执行是无序的
主线程会等待所有的子线程执行结束再结束
线程之间共享全局变量
线程之间共享全局变量数据出现错误问题
互斥锁
mutex = threading.Lock()
上锁
mutex.acquire()
…这里编写代码能保证同一时刻只能有一个线程去操作, 对共享数据进行锁定…
释放锁
mutex.release()
-
1.互斥锁的作用就是保证同一时刻只能有一个线程去操作共享数据,保证共享数据不会出现错误问题
2.使用互斥锁的好处确保某段关键代码只能由一个线程从头到尾完整地去执行
3.使用互斥锁会影响代码的执行效率,多任务改成了单任务执行
4.互斥锁如果没有使用好容易出现死锁的情况 -
死锁
- 使用互斥锁的时候需要注意死锁的问题,要在合适的地方注意释放锁。
死锁一旦产生就会造成应用程序的停止响应,应用程序无法再继续往下执行了。
- 使用互斥锁的时候需要注意死锁的问题,要在合适的地方注意释放锁。
进程和线程的对比
-
- 关系对比
线程是依附在进程里面的,没有进程就没有线程。
一个进程默认提供一条线程,进程可以创建多个线程。
- 关系对比
-
- 区别对比
进程之间不共享全局变量
线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 互斥锁或者线程同步
创建进程的资源开销要比创建线程的资源开销要大
进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
线程不能够独立执行,必须依存在进程中
多进程开发比单进程多线程开发稳定性要强
- 区别对比
- 3.优缺点对比
进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核