python 线程之 threading(三)

时间:2023-03-08 21:06:14

python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html

python 线程之 threading(二)http://www.cnblogs.com/someoneHan/p/6209240.html

使用threading.Thread.is_alive()这个方法可以判断线程是否是存活状态。但是在现有的基础上不能够直到线程什么时候开始,什么时候结束,什么时候被打断。

如果有一个或者多个线程需要在另外的一个线程到达一个确定的点之后才执行下面的操作。这个时候可以使用threading.Event对象。

Event对象和条件标记类似,允许线程等待某个事件发生,如果事件没有被设置而线程在登载该事件发生,那么线程就会被阻塞,直到事件被设置为止。当线程设置了这个事件是,就会唤醒所有等待的线程。

 from threading import Thread, Event
import time def countdown(n, start_evt):
start_evt.wait()
print('countdown start')
while n > 1:
print('T-minus', n)
n -= 1
time.sleep(3) def countUp(n, start_evt):
start_evt.wait()
print('countup start')
while n < 100:
print('T-minus', n)
n += 1
time.sleep(3) # Create the event object that will be used to signal starting
start_evt = Event() print('launching countdown')
t = Thread(target=countdown, args=(10, start_evt))
t.start()
t2 = Thread(target=countUp, args=(1, start_evt))
t2.start()
print('threads to started')
start_evt.set()

代码的运行结果是:

threads to started
countdown start
T-minus 10
countup start

threads to started在countdown start和countup start之前运行。因为countdown和countup两个线程设置了Event事件的等待状态,当事件没有被触发的时候他们是不会开始运行的。

注意:

Event最好只用于一次型事件。因为一旦完成了设置Event对象就会被丢弃,如果在继续使用可能会造成问题。如果要重复的通知某个事件可以使用Condition

Event对象的关键特性是唤醒所用等待的线程,如果只希望唤醒一个等待的线程可以使用Semaphore或者Condition