在我阅读 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.Event
的工作方式与 threading.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'
Tôi là một lập trình viên xuất sắc, rất giỏi!