python gevent.event.Event

python gevent.event.Event

阅读 Gevent Tutorial 后,我对 gevent.event.Event 有疑问。 Event.set() 是否会唤醒所有被 Event.wait() 阻塞的函数?
就像下面的代码:

import gevent
from gevent.event import Event
evt = Event()

def setter():
    print('In setter')
    gevent.sleep(3)
    print("After first sleep")
    evt.set()     #first set
    print 'second sleep'
    gevent.sleep(3)
    evt.set()     #second set
    print 'end of setter'

def waiter():
    print("in waiter")
    evt.wait()     #first wait
    print 'after first wait'
    evt.wait()     #second wait
    print 'end of waiter'

gevent.joinall([
    gevent.spawn(setter),
    gevent.spawn(waiter),
])

当我运行这段代码时,我发现函数'setter'中的第一个设置会唤醒函数'waiter'中的所有等待。但我需要的是首先设置唤醒第一个等待,然后第二个设置唤醒第二个等待。我认为 evt.wait() 只有在 evt.set() 调用时才会被阻塞,我对 gevent.event.Event() 的理解正确吗?如何实现我的想法?

gevent.event.Eventthreading.Event Python 对象完全一样。 因此,一旦设置,它就会唤醒服务员并永远保持设置状态(除非调用 .clear())。

你想实现的可以这样实现:

def setter():
    print('In setter')
    gevent.sleep(3)
    print("After first sleep")
    evt.set()     #first set
    ### now clear evt
    evt.clear()
    ###
    print 'second sleep'
    gevent.sleep(3)
    evt.set()     #second set
    print 'end of setter'