event
– Cross-greenthread primitive¶
- class eventlet.event.Event¶
An abstraction where an arbitrary number of coroutines can wait for one event from another.
Events are similar to a Queue that can only hold one item, but differ in two important ways:
calling
send()
never unschedules the current greenthreadsend()
can only be called once; create a new event to send again.
They are good for communicating results between coroutines, and are the basis for how
GreenThread.wait()
is implemented.>>> from eventlet import event >>> import eventlet >>> evt = event.Event() >>> def baz(b): ... evt.send(b + 1) ... >>> _ = eventlet.spawn_n(baz, 3) >>> evt.wait() 4
- ready()¶
Return true if the
wait()
call will return immediately. Used to avoid waiting for things that might take a while to time out. For example, you can put a bunch of events into a list, and then visit them all repeatedly, callingready()
until one returnsTrue
, and then you canwait()
on that one.
- send(result=None, exc=None)¶
Makes arrangements for the waiters to be woken with the result and then returns immediately to the parent.
>>> from eventlet import event >>> import eventlet >>> evt = event.Event() >>> def waiter(): ... print('about to wait') ... result = evt.wait() ... print('waited for {0}'.format(result)) >>> _ = eventlet.spawn(waiter) >>> eventlet.sleep(0) about to wait >>> evt.send('a') >>> eventlet.sleep(0) waited for a
It is an error to call
send()
multiple times on the same event.>>> evt.send('whoops') Traceback (most recent call last): AssertionError: Trying to re-send() an already-triggered event.
- send_exception(*args)¶
Same as
send()
, but sends an exception to waiters.The arguments to send_exception are the same as the arguments to
raise
. If a single exception object is passed in, it will be re-raised whenwait()
is called, generating a new stacktrace.>>> from eventlet import event >>> evt = event.Event() >>> evt.send_exception(RuntimeError()) >>> evt.wait() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "eventlet/event.py", line 120, in wait current.throw(*self._exc) RuntimeError
If it’s important to preserve the entire original stack trace, you must pass in the entire
sys.exc_info()
tuple.>>> import sys >>> evt = event.Event() >>> try: ... raise RuntimeError() ... except RuntimeError: ... evt.send_exception(*sys.exc_info()) ... >>> evt.wait() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "eventlet/event.py", line 120, in wait current.throw(*self._exc) File "<stdin>", line 2, in <module> RuntimeError
Note that doing so stores a traceback object directly on the Event object, which may cause reference cycles. See the
sys.exc_info()
documentation.
- wait(timeout=None)¶
Wait until another coroutine calls
send()
. Returns the value the other coroutine passed tosend()
.>>> import eventlet >>> evt = eventlet.Event() >>> def wait_on(): ... retval = evt.wait() ... print("waited for {0}".format(retval)) >>> _ = eventlet.spawn(wait_on) >>> evt.send('result') >>> eventlet.sleep(0) waited for result
Returns immediately if the event has already occurred.
>>> evt.wait() 'result'
When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).