12.2 我们加载了一个线程,如何知道它在什么时候启动
- 线程的核心特征就是他们能够以非确定性的方式独立执行(即何时开始,何时被打断、合适终止、合适恢复执行完全由操作系统来调度管理)
- 如果程序中有其它线程需要判断某个线程是否已经达到执行过程中的某个点,根据这个来判断后续的执行操作,那么这就产生了相对较为困难的线程同步问题,为了解决这类问题,我们可以使用threading库中的Event对象。
- Event对象和条件标记类似,允许线程等待某件事情发生,初始状态时事件被设置为0,如果时间没有被执行而线程正在等待该事件,那么线程就会被阻塞即挂起,直到事件被设置为止。当线程设置了这个事件时,会唤醒所有正在等待该事件的线程。
from threading import Thread,Event
import time
def c(n,started_evt):
print('countdown starting')
started_evt.set()
while n>0:
print('T-minus',n)
n -=1
time.sleep(5)
started_evt =Event()
print("launching countdown")
t =Thread(target=c,args=(10,started_evt))
t.start()
started_evt.wait()
print("countdown is running")
- 当这段代码运行时,字符串“countdown starting”总是会在“countdown isr unning”之后显示,这里使用了事件来同步线程,使得主线程在等待,知道c函数首先打印了信息后才开始执行
launching countdown
countdown starting
('T-minus', 10)
countdown is running
('T-minus', 9)
('T-minus', 8)
('T-minus', 7)
('T-minus', 6)
('T-minus', 5)
('T-minus', 4)
('T-minus', 3)
('T-minus', 2)
('T-minus', 1)
网友评论