使用全局变量
event = False
def wait_for_event_timeout(e, t):
time.sleep(5)
global event
event = True
if __name__ == '__main__':
t2 = threading.Thread(name='non-blocking',
target=wait_for_event_timeout,
args=(e, 1))
t2.start()
while True:
time.sleep(1)
if event:
logging.debug('got event')
break
else:
logging.debug('doing other things')
使用螺纹。event
def wait_for_event_timeout(e, t):
time.sleep(5)
e.set()
if __name__ == '__main__':
e = threading.Event()
t2 = threading.Thread(name='non-blocking',
target=wait_for_event_timeout,
args=(e, 1))
t2.start()
while True:
event_is_set = e.wait(1)
if event_is_set:
logging.debug('got event')
break
else:
logging.debug('doing other things')
看起来我可以使用全局变量
做同样的事情事件的用例是什么?
我什么时候要使用全局变量来使用它?
两者之间存在基本差异。当你写
时event_is_set = e.wait(1)
然后,您要说的是等待A Maximal 时间,如果在等待期间,另一个线程触发了更改,将立即注意到(几乎)。相反,
time.sleep(1)
是无条件的时间。如果在等待期间,另一个线程触发了更改,则不会在睡眠结束之前注意到。
。因此,事件本质上比后者更快。
除了指出的重要差异外,如果您不需要等待而不用"做其他事情",则Event
比全局变量更好,因为您不需要使用while
循环:
def wait_for_event_timeout(e, t):
time.sleep(5)
e.set()
if __name__ == '__main__':
e = threading.Event()
t2 = threading.Thread(name='non-blocking',
target=wait_for_event_timeout,
args=(e, 1))
t2.start()
e.wait()
logging.debug('got event')
vs
event = False
def wait_for_event_timeout(e, t):
time.sleep(5)
global event
event = True
if __name__ == '__main__':
t2 = threading.Thread(name='non-blocking',
target=wait_for_event_timeout,
args=(e, 1))
t2.start()
while True:
time.sleep(1)
if event:
logging.debug('got event')
break
不必使用繁忙的环路,这意味着您可以在event
上等待时释放GIL,这将改善应用程序中其他线程的性能。再加上代码更简洁和可读。