10.3.4 枚举所有线程
没有必要为所有守护线程维护一个显式句柄来确保它们在退出主进程之前已经完成。enumerate()会返回活动Thread实例的一个列表。这个列表也包括当前线程,由于等待当前线程终止(join)会引入一种死锁情况,所以必须跳过。
import random
import threading
import time
import logging
def worker():
"""thread worker function"""
pause = random.randint(1,5) / 10
logging.debug('sleeping %0.2f',pause)
time.sleep(pause)
logging.debug('ending')
logging.basicConfig(
level=logging.DEBUG,
format='(%(threadName)-10s) %(message)s',
)
for i in range(3):
t = threading.Thread(target=worker,daemon=True)
t.start()
main_thread = threading.main_thread()
for t in threading.enumerate():
if t is main_thread:
continue
logging.debug('joining %s',t.getName())
t.join()
由于工作线程睡眠的时间量是随机的,所以这个程序的输出可能有变化。
运行结果: