使用全局变量
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')
使用threading.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')
看起来我可以通过使用全局变量
来做同样的事情事件的用例是什么?
我什么时候想使用它来使用全局变量?
答案 0 :(得分:3)
两者之间存在根本区别。当你写
event_is_set = e.wait(1)
然后你正在等待最大时间如果在等待期间,另一个线程触发了一个更改,则会立即注意到(几乎)。相反,
time.sleep(1)
是无条件的时间。如果在等待期间,另一个线程触发了更改,则在睡眠结束之前不会记录。
因此,事件本身比后者更具响应性。答案 1 :(得分:2)
除了Ami Tavory指出的重要区别之外,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')
循环:
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
VS
event
不必使用这样的繁忙循环意味着您可以在等待UITableViewCell *snapshotCell = [targetCell snapshotViewAfterScreenUpdates:YES];
targetCell.alpha = 0;
时释放GIL,这将提高应用程序中其他线程的性能。此外,代码更简洁,更易读。