python 不阻塞线程的情况下优雅的关闭线程

1,153 阅读1分钟

Python中提供了Thread类来支持多线程,线程在执行过程中可以通过调用join()方法来阻塞线程。

要优雅的关闭线程,可以采用下面的方法:

  • 使用Thread类的daemon属性设置为True,表示线程为守护线程,当主线程结束时,守护线程也会自动结束。
  • 使用Thread类的is_alive()方法判断线程是否存活,如果存活则调用join()方法来阻塞线程,直到线程结束。
  • 使用线程的安全标志(比如event对象)来控制线程的执行,当线程需要结束时,设置安全标志并等待线程结束。

以下是一个例子:

import threading
import time

event = threading.Event()

def worker():
    while not event.is_set():
        print('do some work')
        time.sleep(1)
    print('thread exit')

t = threading.Thread(target=worker)
t.daemon = True
t.start()

time.sleep(5)
event.set()

在上面的例子中,worker线程会持续执行直到event对象的is_set()方法返回True,此时线程会优雅的退出。