插件窝 干货文章 Python多线程编程:为什么用join()等待线程结束而不是wait()?

Python多线程编程:为什么用join()等待线程结束而不是wait()?

线程 等待 使用 Thread 110    来源:    2025-03-16

在Python的多线程编程中,join()wait() 是两个不同的概念,它们的作用和使用场景也不同。具体来说,join() 用于等待线程结束,而 wait() 通常与条件变量(Condition)或事件(Event)一起使用,用于线程间的同步。

1. join() 的作用

join()Thread 类的一个方法,用于阻塞当前线程,直到调用 join() 的线程执行完毕。它的主要作用是确保主线程(或其他线程)等待子线程完成后再继续执行。

使用场景:

  • 当你启动了一个或多个线程,并且希望在主线程中等待这些线程完成后再继续执行后续代码时,可以使用 join()
  • 例如,在主线程中启动多个工作线程,然后使用 join() 等待所有工作线程完成后再进行结果汇总。

示例代码:

import threading
import time

def worker():
    print("Worker thread started")
    time.sleep(2)
    print("Worker thread finished")

# 创建线程
t = threading.Thread(target=worker)

# 启动线程
t.start()

# 等待线程结束
t.join()

print("Main thread finished")

在这个例子中,主线程会等待 t 线程执行完毕后再继续执行 print("Main thread finished")

2. wait() 的作用

wait() 通常与 ConditionEvent 对象一起使用,用于线程间的同步。wait() 会使当前线程进入等待状态,直到其他线程调用 notify()notify_all()(对于 Condition)或 set()(对于 Event)来唤醒它。

使用场景:

  • 当你需要线程在某些条件满足时才继续执行时,可以使用 wait()
  • 例如,多个线程需要等待某个共享资源可用时,可以使用 Conditionwait()notify() 机制。

示例代码:

import threading

# 创建一个事件对象
event = threading.Event()

def worker():
    print("Worker thread waiting for event")
    event.wait()  # 等待事件被设置
    print("Worker thread received the event")

# 创建线程
t = threading.Thread(target=worker)

# 启动线程
t.start()

# 模拟一些操作
print("Main thread doing some work")
threading.Event().wait(2)  # 模拟主线程做一些工作

# 设置事件,唤醒等待的线程
event.set()

# 等待线程结束
t.join()

print("Main thread finished")

在这个例子中,worker 线程会等待 event 被设置后才继续执行。

3. 为什么用 join() 而不是 wait()

  • 目的不同join() 的目的是等待线程结束,而 wait() 的目的是线程间的同步。
  • 使用场景不同join() 用于等待线程完成,而 wait() 用于等待某个条件满足。
  • 对象不同join()Thread 类的方法,而 wait()ConditionEvent 类的方法。

总结

  • 如果你需要等待一个线程执行完毕,使用 join()
  • 如果你需要线程在某个条件满足时才继续执行,使用 wait()

因此,join()wait() 是用于不同场景的工具,不能互相替代。