diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-11-21 03:14:28 +0100 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-11-21 03:14:28 +0100 |
commit | 41b8990ce7c27581b6dc48938723321ef6259eb9 (patch) | |
tree | c18c253b668d62eef478369c76ae7403d6cc3966 | |
parent | 3df5acc6a83711473c45d4ec56b27b2daeb89bd6 (diff) | |
download | aioeventlet-41b8990ce7c27581b6dc48938723321ef6259eb9.tar.gz |
example to chain a task with a coroutine
-rw-r--r-- | tests/test_eventlet.py | 78 |
1 files changed, 70 insertions, 8 deletions
diff --git a/tests/test_eventlet.py b/tests/test_eventlet.py index 24c23f5..4d5f019 100644 --- a/tests/test_eventlet.py +++ b/tests/test_eventlet.py @@ -1,12 +1,12 @@ import eventlet import tests -def slow_append(result, value, delay): +def eventlet_slow_append(result, value, delay): eventlet.sleep(delay) result.append(value) return value * 10 -def slow_error(delay): +def eventlet_slow_error(delay): eventlet.sleep(delay) raise ValueError("error") @@ -37,16 +37,16 @@ try: result = [] loop = asyncio.get_event_loop() - g1 = eventlet.spawn(slow_append, result, 1, 0.2) + g1 = eventlet.spawn(eventlet_slow_append, result, 1, 0.2) value = yield from wait_greenthread(g1, loop=loop) result.append(value) - g2 = eventlet.spawn(slow_append, result, 2, 0.1) + g2 = eventlet.spawn(eventlet_slow_append, result, 2, 0.1) value = yield from wait_greenthread(g2, loop=loop) result.append(value) - g3 = eventlet.spawn(slow_error, 0.001) + g3 = eventlet.spawn(eventlet_slow_error, 0.001) try: yield from wait_greenthread(g3, loop=loop) except ValueError as exc: @@ -54,6 +54,17 @@ try: result.append(4) return result + + @asyncio.coroutine + def coro_slow_append(result, value, delay): + yield from asyncio.sleep(delay) + result.append(value) + return value * 10 + + @asyncio.coroutine + def coro_slow_error(delay): + yield from asyncio.sleep(delay) + raise ValueError("error") ''') except ImportError: import trollius as asyncio @@ -82,16 +93,16 @@ except ImportError: result = [] loop = asyncio.get_event_loop() - g1 = eventlet.spawn(slow_append, result, 1, 0.2) + g1 = eventlet.spawn(eventlet_slow_append, result, 1, 0.2) value = yield From(wait_greenthread(g1, loop=loop)) result.append(value) - g2 = eventlet.spawn(slow_append, result, 2, 0.1) + g2 = eventlet.spawn(eventlet_slow_append, result, 2, 0.1) value = yield From(wait_greenthread(g2, loop=loop)) result.append(value) - g3 = eventlet.spawn(slow_error, 0.001) + g3 = eventlet.spawn(eventlet_slow_error, 0.001) try: yield From(wait_greenthread(g3, loop=loop)) except ValueError as exc: @@ -100,6 +111,51 @@ except ImportError: result.append(4) raise Return(result) + @asyncio.coroutine + def coro_slow_append(result, value, delay): + yield From(asyncio.sleep(delay)) + result.append(value) + raise Return(value * 10) + + @asyncio.coroutine + def coro_slow_error(delay): + yield From(asyncio.sleep(delay)) + raise ValueError("error") + + +def wait_task(task): + event = eventlet.event.Event() + def done(fut): + try: + result = fut.result() + except Exception as exc: + # FIXME + event.send_exception(exc) + else: + event.send(result) + + task.add_done_callback(done) + return event.wait() + +def greenthread_chain_coro(result, loop): + t1 = loop.create_task(coro_slow_append(result, 1, 0.2)) + value = wait_task(t1) + result.append(value) + + t2 = loop.create_task(coro_slow_append(result, 2, 0.1)) + value = wait_task(t2) + result.append(value) + + t3 = loop.create_task(coro_slow_error(0.001)) + try: + value = wait_task(t3) + except ValueError as exc: + result.append(str(exc)) + + result.append(4) + loop.call_soon(loop.stop) + return result + class EventletTests(tests.TestCase): def test_stop(self): @@ -148,6 +204,12 @@ class EventletTests(tests.TestCase): result = self.loop.run_until_complete(coro_chain_greenthread()) self.assertEqual(result, [1, 10, 2, 20, 'error', 4]) + def test_greenthread_chain_coro(self): + result = [] + self.loop.call_soon(eventlet.spawn, greenthread_chain_coro, result, self.loop) + self.loop.run_forever() + self.assertEqual(result, [1, 10, 2, 20, 'error', 4]) + if __name__ == '__main__': import unittest |