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

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

线程 等待 Event 使用 202    来源:    2025-03-16

在Python的多线程编程中,join()wait() 是两个不同的概念,它们分别用于不同的场景。理解它们的区别对于编写正确的多线程程序非常重要。

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 线程执行完毕后再继续执行。

2. wait() 的作用

wait()threading.Conditionthreading.Event 类的方法,用于线程间的同步。wait() 会让当前线程进入等待状态,直到其他线程调用 notify()notify_all()(对于 Condition)或 set()(对于 Event)来唤醒它。

使用场景:

  • 当你需要线程之间进行协调时,可以使用 wait()。例如,一个线程需要等待另一个线程完成某些操作后才能继续执行。
  • wait() 通常与 ConditionEvent 一起使用,用于实现复杂的线程同步逻辑。

示例代码:

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)  # 模拟2秒的延迟

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

# 等待子线程完成
t.join()

print("Main thread finished")

在这个例子中,worker 线程会等待 event 被设置,而主线程在完成一些操作后会设置 event,从而唤醒 worker 线程。

3. 为什么用 join() 而不是 wait() 等待子线程?

  • 目的不同join() 的目的是等待一个线程的结束,而 wait() 的目的是线程间的同步。
  • 使用场景不同:如果你只是想等待一个线程完成,join() 是最直接和简单的方式。如果你需要线程间的协调或同步,才需要使用 wait()
  • 复杂性wait() 通常与 ConditionEvent 一起使用,涉及更复杂的线程同步逻辑,而 join() 的使用更为简单直接。

总结

  • 使用 join() 来等待一个线程的结束。
  • 使用 wait() 来实现线程间的同步和协调。

在大多数情况下,如果你只是想等待子线程完成,join() 是更合适的选择。而 wait() 则用于更复杂的线程同步场景。