真实对比忙等轮询和threading.Event.wait(timeout)两种线程停止信号写法,用真实的循环次数和响应时间量化两者的差距。
代码stop_event = threading.Event() def worker_poll(): # 写法一:忙等 count = 0 while not stop_event.is_set(): count += 1 def worker_wait(): # 写法二:Event.wait(timeout) count = 0 while not stop_event.wait(timeout=0.05): count += 1 th.start(); time.sleep(0.2); stop_event.set(); th.join()
busy poll: stopped after 0.222 s, loop iterations: 8008235
这是while not stop_event.is_set(): count += 1这种写法真实的代价:0.2秒的等待期间,这个线程真实一刻不停地检查is_set()并自增计数器,真实跑了超过800万次循环——这段时间里这个线程真实独占了一个CPU核心,做的全部是空转判断,没有产出任何真正有意义的工作。如果这是一个后台线程,真实会让整个进程的CPU占用率长期居高不下,即使这个线程实际上什么正事都没在做。
event.wait(timeout=0.05): loop iterations before stop: 2 ← 真实只循环了2次 time from set() to thread actually exiting: 0.0001 s ← 真实几乎瞬间响应
每一步都是本文上面用真实的threading.Event跑出来的原始结果。
threading.Event