2015-05-13 54 views
1

使用全局变量使用蟒蛇线程:事件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 
     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') 

看起来我可以使用全局变量做同样的

什么用情况事件?
我什么时候想使用它来使用全局变量?

回答

3

这两者之间有一个根本的区别。当你写

event_is_set = e.wait(1) 

,那么你陈述等待最大时间如果在等待的过程中,其他线程引发了变化,应当注意的(几乎)马上。相反,

time.sleep(1) 

是无条件的时间。如果在等待期间另一个线程触发了更改,则在睡眠结束之前将不会被注意到。

因此,事件本身比后者更敏感。

+0

我可以看到为什么如果等待时间很长,这可能会有用。虽然看起来很微不足道 – ealeon

+0

你是对的。但是,请注意,使用全局变量方法,您需要找到“最佳位置”,其中您的响应性差异微乎其微,但CPU开销不会太高。使用一个事件(具有很高的或无限的等待时间),会自动给你这个。 –

2

除了重要的区别阿美Tavory指出,如果你想等待没有“做其他事情”,你需要等待,因为你不需要使用while循环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() 
    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 

不必使用一个繁忙的循环一样,这意味着你可以离开GIL释放,而你伺候event,这将提高哟其它线程的性能你的申请。再加上代码更简洁可读。