一个例子看懂 Python 多线程怎么用

本文介绍了如何在Python中使用threading模块创建线程,并演示了如何让线程间实现同步,包括使用Thread对象的join方法。通过实例展示了老师讲解题目与学生反馈的场景,帮助理解多线程应用和控制线程执行流程。
摘要由CSDN通过智能技术生成

现代计算机上面,CPU 是多核的, 每个核都可以执行代码。

要运行程序里面的代码,操作系统就会分配一个 CPU 核心去执行该代码。

有的时候,我们希望,能够让更多的 CPU 核心同时执行我们的程序里面的一些代码。


1.用一个简单的栗子引入概念

那么我们的程序代码怎么产生新线程呢?

应用程序必须 通过操作系统提供的 系统调用,请求操作系统分配一个新的线程。

python3 将 系统调用创建线程 的功能封装在 标准库 threading 中。

我们来看下面的代码

print('老师正在讲解一道题目中...')

# 从 threading 库中导入Thread类
from threading import Thread
from time import sleep

# 定义一个函数,作为新线程执行的入口函数
def threadFunc(arg):
    print('子线程 开始,系统同时接受同学们反馈:')
    print(f'听懂这道题目的同学为:{arg}')
    sleep(5)
    print('子线程 结束')


# 创建 Thread 类的实例对象
thread = Thread(
    # target 参数 指定 新线程要执行的函数
    # 注意,这里指定的函数对象只能写一个名字,不能后面加括号,
    # 如果加括号就是直接在当前线程调用执行,而不是在新线程中执行了
    target=threadFunc,

    # 如果 新线程函数需要参数,在 args里面填入参数
    # 注意参数是元组, 如果只有一个参数,后面要有逗号,像这样 args=('参数1',)
    args=('10',)
)

# 执行start 方法,就会创建新线程,
# 并且新线程会去执行入口函数里面的代码。
# 这时候 这个进程 有两个线程了。
thread.start()

print('主线程结束')

在创建了一个Thread实例对象后,新的线程还没有创建。

要创建线程,必须要调用 Thread 实例对象的 start方法 。

在这里插入图片描述
老师讲题目和系统接受有没有听懂的反馈是同时进行的,所以这就是多线程的应用了,然后可以看到运行上面的代码后,先结束的是主线程,但是打印这句话的代码是最后一句,按照我们单线程的想法,它一定是最后才执行的,所以这就是多线程了。


2.如何让线程等待另外一个线程呢?

比如老师讲题是5分钟,但是学生反馈是6分钟,这个时候老师都讲下一题了(主线程结束),同学才反馈好。就像上面的代码一样。

有的时候, 一个线程需要等待其它的线程结束,比如需要根据其他线程运行结束后的结果进行处理。

这时可以使用 Thread对象的 join 方法

thread.join()

如果一个线程A的代码调用了 对应线程B的 Thread对象的 join 方法,线程A就会停止继续执行代码,等待线程B结束。 线程B结束后,线程A才继续执行后续的代码。

所以主线程在执行上面的代码时,就暂停在此处, 一直要等到 新线程执行完毕,退出后,才会继续执行后续的代码。

print('老师正在讲解一道题目中...')

from threading import Thread
from time import sleep

def threadFunc(arg):
    print('子线程 开始,系统同时接受同学们反馈:')
    print(f'听懂这道题目的同学为:{arg}')
    sleep(5)
    print('反馈完成,子线程 结束')

thread = Thread(
    target=threadFunc,
    args=('10',)
)

thread.start()

# 主线程的代码执行 子线程对象的join方法,
# 就会等待子线程结束,才继续执行下面的代码
thread.join()

print('老师知道了大家的学习情况,主线程结束')

在这里插入图片描述

3.总结

初步学习后,我们主要掌握了:

  1. 创建了Thread实例对象,用 Thread 实例对象的 start方法创建线程。
  2. 使用 Thread对象的 join 方法,把一个进程加入到别的进程中。

4.也许你还想看

Python 多线程中正确使用共享数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值