2.1多线程的概念
线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度,也就是说线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
线程是Python程序中实现多任务的另外一种方式,线程的执行需要cpu调度来完成。
导入线程模块
import threading
创建子线程并指定执行的任务
sub_thread = threading.Thread(target=任务名)
启动线程执行任务
sub_thread.start()
1. 导入线程模块 #导入线程模块 import threadingCopy 2. 线程类Thread参数说明 Thread([group [, target [, name [, args [, kwargs]]]]]) group: 线程组,目前只能使用None target: 执行的目标任务名 args: 以元组的方式给执行任务传参 kwargs: 以字典方式给执行任务传参 name: 线程名,一般不用设置 3. 启动线程 启动线程使用start方法
线程执行任务并传参有两种方式:
元组方式传参(args) :元组方式传参一定要和参数的顺序保持一致。
字典方式传参(kwargs):字典方式传参字典中的key一定要和参数名保持一致。
线程之间执行是无序的
线程之间执行是无序的,它是由cpu调度决定的 ,cpu调度哪个线程,哪个线程就先执行,没有调度的线程不能执行。
进程之间执行也是无序的,它是由操作系统调度决定的,操作系统调度哪个进程,哪个进程就先执行,没有调度的进程不能执行。
主线程会等待所有的子线程执行结束再结束
设置守护主线程有两种方式:
threading.Thread(target=show_info, daemon=True)
线程对象.setDaemon(True)
线程之间共享全局变量
线程之间共享全局变量数据出现错误问题
线程同步: 保证同一时刻只能有一个线程去操作全局变量
线程等待(join)
关系对比
区别对比
优缺点对比
线程是依附在进程里面的,没有进程就没有线程。
一个进程默认提供一条线程,进程可以创建多个线程。
进程之间不共享全局变量
线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 线程同步
创建进程的资源开销要比创建线程的资源开销要大
进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
线程不能够独立执行,必须依存在进程中
多进程开发比单进程多线程开发稳定性要强
进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核