Code import
This commit is contained in:
61
venv/lib/python2.7/site-packages/eventlet/coros.py
Normal file
61
venv/lib/python2.7/site-packages/eventlet/coros.py
Normal file
@@ -0,0 +1,61 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from eventlet import event as _event
|
||||
|
||||
|
||||
class metaphore(object):
|
||||
"""This is sort of an inverse semaphore: a counter that starts at 0 and
|
||||
waits only if nonzero. It's used to implement a "wait for all" scenario.
|
||||
|
||||
>>> from eventlet import coros, spawn_n
|
||||
>>> count = coros.metaphore()
|
||||
>>> count.wait()
|
||||
>>> def decrementer(count, id):
|
||||
... print("{0} decrementing".format(id))
|
||||
... count.dec()
|
||||
...
|
||||
>>> _ = spawn_n(decrementer, count, 'A')
|
||||
>>> _ = spawn_n(decrementer, count, 'B')
|
||||
>>> count.inc(2)
|
||||
>>> count.wait()
|
||||
A decrementing
|
||||
B decrementing
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.counter = 0
|
||||
self.event = _event.Event()
|
||||
# send() right away, else we'd wait on the default 0 count!
|
||||
self.event.send()
|
||||
|
||||
def inc(self, by=1):
|
||||
"""Increment our counter. If this transitions the counter from zero to
|
||||
nonzero, make any subsequent :meth:`wait` call wait.
|
||||
"""
|
||||
assert by > 0
|
||||
self.counter += by
|
||||
if self.counter == by:
|
||||
# If we just incremented self.counter by 'by', and the new count
|
||||
# equals 'by', then the old value of self.counter was 0.
|
||||
# Transitioning from 0 to a nonzero value means wait() must
|
||||
# actually wait.
|
||||
self.event.reset()
|
||||
|
||||
def dec(self, by=1):
|
||||
"""Decrement our counter. If this transitions the counter from nonzero
|
||||
to zero, a current or subsequent wait() call need no longer wait.
|
||||
"""
|
||||
assert by > 0
|
||||
self.counter -= by
|
||||
if self.counter <= 0:
|
||||
# Don't leave self.counter < 0, that will screw things up in
|
||||
# future calls.
|
||||
self.counter = 0
|
||||
# Transitioning from nonzero to 0 means wait() need no longer wait.
|
||||
self.event.send()
|
||||
|
||||
def wait(self):
|
||||
"""Suspend the caller only if our count is nonzero. In that case,
|
||||
resume the caller once the count decrements to zero again.
|
||||
"""
|
||||
self.event.wait()
|
||||
Reference in New Issue
Block a user