第二十二天Python之线程

一、线程的介绍

1. 实现多任务的另一种形式

在 Python 中,想要实现多任务还可以使用 多线程 来完成

2. 为什么使用多线程

进程是分配资源的最小单位,一旦创建一个进程就会分配一定的资源,就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的

线程是 程序执行的最小单位 ,实际上进程之负责分配资源,而利用这些资源执行程序的是线程,也就说进程是线程的容器,一个进程中最少有一个线程 来负责执行程序,同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程 共享进程所拥有的全部资源 ,这就像用过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样,实现多任务的同时也节省了资源。

3. 多线程的作用

在这里插入图片描述

同样需求使用多线程完成

4. 多线程的作用

在这里插入图片描述

线程介绍

  • 多线程是Python程序中实现多任务的一种方式
  • 线程是程序执行的最小单位
  • 同属一个进程的多个线程共享进程所拥有的全部资源

二、多线程完成多任务

1. 线程的创建步骤

  • 导入线程模块
    import threading

  • 通过线程类创建线程对象
    线程对象 = threading.Thread(target=任务名)

  • 启动线程执行任务
    线程对象.start()

2. 通过线程类创建线程对象

线程对象 = threading.Thread(target=任务名)

参数名说明
target执行的目标任务名,这里指的是函数名(方法名)
name线程名,一般不用设置
group线程组,目前只能使用None

3. 线程创建与启动的代码

# 创建子线程
sing_thread = threading.Thread(target=sing)
# 创建子线程
dance_thread = threading.Thread(target=dance)
# 启动线程
sing_thread.start()
dance_thread.start()

多线程完成多任务

  • 导入线程模块
    Import threading

  • 创建子线程并制定执行的任务
    sub_thread = threading.Thread(target=任务名)

  • 启动线程执行任务
    sub_thread.start()

三、线程执行带有参数的任务

1. 线程执行带有参数的任务

参数名说明
args以元组的方式给执行任务传参
kwargs以字典方式给执行任务传参

2. args参数的作用

# target:线程执行的函数名
# args:表示以元组的方式给函数传参
sing_thread = threading.Thread(target=sing,args=(3,))
sing_thread.start()

3. kwargs参数的使用

# target:线程执行的函数名
# kwargs:表示以字典的方式给函数传参
dance_thread = threading.Thread(target=dance,kwargs={"count": 3})
# 开启线程
dance_thread.start()

线程执行带有参数的任务

  • 元组方式传参: 元组方式传参一定要和参数的顺序保持一致
  • 字典方式传参: 字典方式传参字典中的key一定要和参数名保持一致

四、主线程和子线程的结束顺序

对比进程

主线程会等待所有的子线程执行结束后主线程再结束

1. 设置守护主线程

要想主线程不等待子线程执行完成可以设置守护主线程

# 设置守护主线程方式1,daemon=True 守护主线程
work_thread = threading.Thread(target=work, daemon=True)
# 设置守护主线程方式2
# work_thread.setDaemon(True)
work_thread.start()
# 主线程延时1秒
time.sleep(1)
print("over")

主线程和子线程结束顺序

  • 主线程会等待所有的子线程执行结束再结束,除非设置子线程守护主线程
  • 设置守护主线程有两种方式:
  1. threading.Thread(target=work, daemon=True)
  2. 线程对象.setDaemon(True)

五、线程间的执行顺序

线程间执行顺序
在这里插入图片描述

1. 线程之间执行时无序的

for i in range(5):
	sub_thread = threading.Thread(target=task)
	sub_thread.start()

2. 获取当前的线程信息

# 通过current_thread方法获取线程对象
current_thread = threading.current_thread()

# 通过current_thread对象可以知道线程的相关信息,例如被创建的顺序
print(current_thread)

线程间的执行顺序

  • 线程之间执行是无序的,是由CPU调度决定某个线程先执行的

六、进程和线程对比

1. 关系对比

  • 线程是依附在进程里面的,没有进程就没有线程
  • 一个进程默认提供一条线程,进程可以创建多个线程
    在这里插入图片描述

2. 区别对比

  • 创建进程的资源开销要比创建线程的资源开销要大
  • 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
  • 线程不能够独立执行,必须依存在进程中

3. 优缺点对比

  • 进程优缺点:
    优点:可以用多核
    缺点:资源开销大
  • 线程优缺点
    优点:资源开销小
    缺点:不能使用多核

进程和线程的对比

  • 关系对比
  • 区别对比
  • 优缺点对比
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值