Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python gevent.event.Event

Tags:

python

gevent

After i read the Gevent Tutorial, i have a question about the gevent.event.Event. Does the Event.set() will wake up all the function which is blocked by Event.wait() ?
Just like the following code:

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),
])

When i run this code, i found the first set in function 'setter' will wake up all the wait in function 'waiter'. But what i need is first set wake up the first wait and then the second set wake up second wait. In my opinion, evt.wait() will be blocked only when evt.set() call, Does my understanding of gevent.event.Event() correctly ? How to realize my idea ?

like image 846
vinllen Avatar asked Oct 27 '25 03:10

vinllen


1 Answers

gevent.event.Event works exactly like the threading.Event Python object. So, once it is set, it wakes up waiters and stays set forever (except if .clear() is called).

What you want to achieve can be done like this:

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'
like image 125
mguijarr Avatar answered Oct 30 '25 15:10

mguijarr



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!