一、多任务介绍
1、概念:同一时间执行多个任务。
2、作用:充分利用CPU资源,提高程序的执行效率。
3、表现形式:并发和并行
并发:交替执行多个任务(如:单核CPU);
并行:同时执行多个任务(如:多核CPU,任务数量<=CPU的核心数);
二、使用多进程执行多任务
1、进程介绍
进程是资源分配的最小单元,它是操作系统进行资源分配和调度运行的基本单位。通俗的可以理解为一个正在运行的程序就是一个进程。
2、执行多任务操作流程
step1、导入进程包:import multiprocessing
step2、通过进程类来创建进程对象:process_object = multiprocessing.Proces(target=任务名)
其中,执行的目标任务名指的是待运行的函数名(或方法名)
step3、启动进程执行任务:process_object.start()
3、进程执行带有参数的任务
在创建进程对象时,可以通过args或者kwargs进行参数的传递。
参数名 | 说明 | 注意点 |
args | 以元组的方式给执行任务传参 | 传参一定要和方法中参数的顺序保持一致 |
kwargs | 以字典的方式给执行任务传参 | 字典中key一定要和方法中参数名保持一致 |
4、主进程和子进程的结束顺序
为了保证子进程能够正常的进行,主进程会等所有的的子进程执行完成之后再销毁;
如果将子进程设置为守护主进程,则主进程退出,未执行完的子进程销毁,主进程不再等待子进程的执行;
将子进程设置为守护进程的方式:process_object.daemon = True
5、获取进程的编号
os.getpid():获取当前进程号
os.getppid():获取当前进程的父进程号
三、使用多线程执行多任务
1、线程介绍
进程是分配资源的最小单位,一旦创建一个进程就会分配一定的资源;
线程是程序执行的最小单元;
实际上进程只负责分配资源,而利用这些资源执行程序的是线程。
进程可以看做线程的容器,一个进程中至少有一个线程来负责执行程序;
线程可以与同属于一个进程中的其他线程共享进程中所拥有的全部资源。
2、执行多任务操作流程
step1、导入线程模块:import threading
step2、创建子线程对象并指定执行的任务:thread_object = threading.Thread(target=任务名)
其中,执行的目标任务名指的是待运行的函数名(或方法名)
step3、启动线程执行任务:thread_object.start()
3、线程执行带有参数的任务
参数名 | 说明 | 注意点 |
args | 以元组的方式给执行任务传参 | 传参一定要和方法中参数的顺序保持一致 |
kwargs | 以字典的方式给执行任务传参 | 字典中key一定要和方法中参数名保持一致 |
4、主线程和子线程的结束顺序
主线程会等所有的子线程执行结束后再结束,除非将子线程设置为守护主线程;
设置守护主线程的两种方式:
(1)threading.Tjread(target=work,daemon=True)
(2)thread_object.setDaemon(True)
5、线程之间的执行顺序
线程之间执行是无序的,由CPU调度决定某个线程先执行。
四、线程和进程对比
1、关系对比
(1)线程依附在进程里,没有进程就没有线程;
(2)一个进程默认提供一条线程,但是进程也可以创建多个线程。
2、区别对比
(1)创建进程的资源开销要比线程大;
(2)进程是操作系统资源分配的基本单元,而线程则是CPU调度的基本单位;
(3)线程不能够独立运行,必须依存在进程中。
3、优缺点对比
(1)进程优缺点
优点:可以使用多核
缺点:资源开销大
(2)线程优缺点
优点:资源开销小
缺点:不可以使用多核