pin_drop当前位置:知识文库 ❯ 图文
Python threading模块详解 - 线程创建与管理入门
threading模块概述
threading 是Python标准库中用于多线程编程的模块,提供了丰富的线程管理功能,包括线程创建、启动、同步、通信等。
创建线程的方式
方式一:直接创建Thread对象
代码示例
import threading
def worker(name):
"""线程工作函数"""
print(f"线程 {name} 正在运行")
# 创建线程
t = threading.Thread(target=worker, args=("A",))
t.start() # 启动线程
t.join() # 等待线程结束方式二:继承Thread类
代码示例
import threading
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
"""重写run方法"""
print(f"线程 {self.name} 正在运行")
# 创建并启动线程
t = MyThread("B")
t.start()
t.join()start与join方法
start()方法
start() 方法用于启动线程,它会调用线程的 run() 方法。注意:不能直接调用 run() 方法,否则不会创建新线程。
join()方法
join() 方法用于阻塞当前线程,直到调用该方法的线程执行完毕。可以设置超时参数。
代码示例
import threading
import time
def task(name, duration):
print(f"任务 {name} 开始")
time.sleep(duration)
print(f"任务 {name} 结束")
# 创建多个线程
threads = []
for i in range(3):
t = threading.Thread(target=task, args=(f"T{i}", 2))
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join() # 阻塞主线程,直到线程t结束
print("所有任务完成")守护线程
守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护线程会自动退出。常用于后台服务,如心跳检测、垃圾回收等。
代码示例
import threading
import time
def daemon_task():
"""守护线程任务"""
while True:
print("守护线程运行中...")
time.sleep(1)
def main_task():
"""主任务"""
print("主任务开始")
time.sleep(3)
print("主任务结束")
# 创建守护线程
daemon = threading.Thread(target=daemon_task)
daemon.daemon = True # 设置为守护线程
daemon.start()
# 创建普通线程
main = threading.Thread(target=main_task)
main.start()
main.join()
print("主线程结束,守护线程自动退出")线程常用方法
-
start():启动线程
-
join([timeout]):等待线程结束
-
is_alive():检查线程是否仍在运行
-
getName():获取线程名称
-
setName():设置线程名称
-
current_thread():获取当前线程对象
-
enumerate():返回所有活跃线程列表
注意事项
注意1:不要直接调用
run()方法,应该调用start()方法,否则不会创建新线程。
注意2:守护线程必须在
start()之前设置,否则会抛出异常。
注意3:线程间共享数据时,必须使用锁机制保证数据一致性,避免竞态条件。
小结
-
threading模块提供了丰富的线程管理功能
-
创建线程有两种方式:直接创建Thread对象或继承Thread类
-
start()启动线程,join()等待线程结束
-
守护线程随主线程结束而自动退出,适合后台服务
练习题
练习1
使用threading模块创建5个线程,每个线程打印自己的编号和当前时间,观察线程的执行顺序。
练习2
创建一个守护线程,每秒打印一次心跳信息,主线程运行3秒后退出,观察守护线程的行为。
常见问题
1. start()和run()方法有什么区别?
start()方法会创建新线程并调用run()方法,实现真正的并发;直接调用run()方法只是在当前线程中执行,不会创建新线程。
2. 什么是守护线程?它有什么特点?
守护线程是一种后台服务线程,当所有非守护线程结束时,守护线程会自动退出。常用于心跳检测、垃圾回收等不需要强制完成的后台任务。
3. join()方法的作用是什么?
join()方法用于阻塞当前线程,直到调用该方法的线程执行完毕。可以设置超时参数,避免无限期等待。常用于主线程等待多个子线程完成。
本文涉及AI创作
内容由AI创作,请仔细甄别