python threading:事件与全局变量

时间:2015-05-13 15:06:50

标签: python multithreading

使用全局变量

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')

看起来我可以通过使用全局变量

来做同样的事情

事件的用例是什么?
我什么时候想使用它来使用全局变量?

2 个答案:

答案 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,这将提高应用程序中其他线程的性能。此外,代码更简洁,更易读。