Patch and test from Malcolm Cleaton for Event objects.
This commit is contained in:
1
AUTHORS
1
AUTHORS
@@ -64,3 +64,4 @@ Thanks To
|
||||
* Slide, for open-sourcing gogreen
|
||||
* Holger Krekel, websocket example small fix
|
||||
* mikepk, debugging MySQLdb/tpool issues
|
||||
* Malcolm Cleaton, patch for Event exception handling
|
||||
|
||||
@@ -153,18 +153,16 @@ class Event(object):
|
||||
exc = (exc, )
|
||||
self._exc = exc
|
||||
hub = hubs.get_hub()
|
||||
if self._waiters:
|
||||
for waiter in self._waiters:
|
||||
hub.schedule_call_global(
|
||||
0, self._do_send, self._result, self._exc, self._waiters.copy())
|
||||
0, self._do_send, self._result, self._exc, waiter)
|
||||
|
||||
def _do_send(self, result, exc, waiters):
|
||||
while waiters:
|
||||
waiter = waiters.pop()
|
||||
if waiter in self._waiters:
|
||||
if exc is None:
|
||||
waiter.switch(result)
|
||||
else:
|
||||
waiter.throw(*exc)
|
||||
def _do_send(self, result, exc, waiter):
|
||||
if waiter in self._waiters:
|
||||
if exc is None:
|
||||
waiter.switch(result)
|
||||
else:
|
||||
waiter.throw(*exc)
|
||||
|
||||
def send_exception(self, *args):
|
||||
"""Same as :meth:`send`, but sends an exception to waiters.
|
||||
|
||||
@@ -12,6 +12,12 @@ class TestEvent(LimitedTestCase):
|
||||
self.assertEqual(evt.wait(), value)
|
||||
|
||||
def test_multiple_waiters(self):
|
||||
self._test_multiple_waiters(False)
|
||||
|
||||
def test_multiple_waiters_with_exception(self):
|
||||
self._test_multiple_waiters(True)
|
||||
|
||||
def _test_multiple_waiters(self, exception):
|
||||
evt = event.Event()
|
||||
value = 'some stuff'
|
||||
results = []
|
||||
@@ -19,12 +25,15 @@ class TestEvent(LimitedTestCase):
|
||||
evt.wait()
|
||||
results.append(True)
|
||||
i_am_done.send()
|
||||
if exception:
|
||||
raise Exception()
|
||||
|
||||
waiters = []
|
||||
count = 5
|
||||
for i in range(count):
|
||||
waiters.append(event.Event())
|
||||
eventlet.spawn_n(wait_on_event, waiters[-1])
|
||||
eventlet.sleep() # allow spawns to start executing
|
||||
evt.send()
|
||||
|
||||
for w in waiters:
|
||||
|
||||
Reference in New Issue
Block a user