目录
- 1.用一个简单的栗子引入概念
- 2.如何让线程等待另外一个线程呢?
- 3.总结
- 4.也许你还想看
现代计算机上面,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.总结
初步学习后,我们主要掌握了:
- 创建了Thread实例对象,用 Thread 实例对象的 start方法创建线程。
- 使用 Thread对象的 join 方法,把一个进程加入到别的进程中。