Python线程:事件与全局变量



使用全局变量

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,这将改善应用程序中其他线程的性能。再加上代码更简洁和可读。

最新更新