一、多任务的执行方式
- 并发:在一段时间内交替去执行任务(单核CPU)
- 并行:CPU核数大于任务数
二、进程(实现多任务)——操作系统调度
- 进程是操作系统进行资源分配的基本单元
- 一个程序至少有一个进程,一个进程默认有一个线程:线程是依附在进程内的
- 进程注意点
- 进程之间不共享全局变量( 主进程:Windows需要添加main防止递归)
- 主进程会等待所有的子进程结束再结束
- 主进程退出子进程销毁
- 让子进程设置成为守护主进程,主进程退出子进程销毁,子进程会很依赖主进程
sub_process = multiprocess.Process(target=task)
sub_process.daemon = True
sub_process.start() - 让主进程退出之前先让子进程销毁
sub_process.terminate()
- 让子进程设置成为守护主进程,主进程退出子进程销毁,子进程会很依赖主进程
三、线程(实现多任务)——cpu调度
- 线程是cpu调度的基本单位,每个进程至少都有一个线程,即主线程
线程注意点: - 线程之间执行是无序的
- 主线程会等待所有的子线程执行结束再结束
- 线程之间共享全局变量
- 可能出现错误问题:全局变量问题、数据不同步
- 解决方案:线程等待:join()、互斥锁、线程等待和互斥锁,都是改成单任务执行:保证数据准确性,但是执行性能下降
- 死锁:一直等待对方释放锁的情景
四、 对比
- 全局变量
- 进程之间不共享
- 线程共享,注意资源竞争(线程等待,互斥锁)
- 创建进程的资源开销 > 线程
- 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
- 线程不能独立执行,必须存在进程中
- 多进程开发比单进程多线程开发稳定性强