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()方法用于阻塞当前线程,直到调用该方法的线程执行完毕。可以设置超时参数,避免无限期等待。常用于主线程等待多个子线程完成。

标签: threading模块 线程创建 守护线程 start/join Python多线程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python进程与线程概念详解 - 并发与并行入门指南 下一篇: Python Thread类详解 - 自定义线程编程指南

poll相关推荐