在 Python 中,默认每个 Python 文件会创建一个进程,用于提供运行资源和环境。进程启动后,会创建一个主线程,用于执行程序代码。
线程是并发编程的核心之一,本文将详细解析 Python 中线程的基础概念、常见操作、线程安全以及线程池的使用。
一、线程基础
1. 什么是线程?
线程是计算机中可以被 CPU 调度的最小单位。每个线程在程序中独立运行,多个线程可以并发执行。在 Python 中,线程由 threading
模块提供支持。
2. 创建线程
Python 提供了非常简单的方式来创建线程,可以通过 threading.Thread
类来定义和启动线程。
示例:创建一个线程
import threading
def func(a1, a2, a3):
print(f"Arguments received: {
a1}, {
a2}, {
a3}")
# 创建线程并传入目标函数和参数
t = threading.Thread(target=func, args=(11, 22, 33))
t.start() # 启动线程
t.join() # 等待线程完成
二、多线程开发
在多线程编程中,主线程从上到下执行代码。当需要创建子线程时,主线程会调用子线程并继续向下执行。如果程序运行结束前子线程未完成任务,主线程会进入等待状态,直到所有子线程执行完毕。
1. 线程的常见方法
以下是线程对象的一些常用方法:
-
t.start()
启动线程,使其进入就绪状态,等待 CPU 调度。线程的执行时间由操作系统决定。 -
t.join()
主线程等待当前线程执行完毕后再继续执行后续代码。通常用于保证线程的同步。 -
t.setDaemon(布尔值)
设置线程的守护状态:True
:设置为守护线程,当主线程结束时,子线程会自动退出。False
(默认):设置为非守护线程,主线程会等待子线程完成后再退出。
-
线程名称的设置和获取
可以通过name
参数设置线程名称,或使用threading.current_thread().name
获取当前线程的名称。
示例:线程名称
import threading
def my_func():
print('Thread name is', threading.current_thread().name)
# 创建线程并设置名称
my_thread = threading.Thread(target=my_func, name='MyThread')
my_thread.start()
2. 自定义线程类
可以通过继承 threading.Thread
类,自定义线程行为,将线程需要执行的逻辑写入 run()
方法中。
示例:定义一个自定义线程类
import threading
import