diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-11-21 02:49:58 +0100 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-11-21 02:49:58 +0100 |
commit | 19391bbc96a7de41e082d54200b16e3f500335db (patch) | |
tree | 8d2e03b058f4c69828ccf74c72c13984ed921023 | |
parent | a7ba3e2484cccaeefb07222c57acae9f8a247193 (diff) | |
download | aioeventlet-19391bbc96a7de41e082d54200b16e3f500335db.tar.gz |
Test for chain coroutine to greenthread
-rw-r--r-- | tests/test_eventlet.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/test_eventlet.py b/tests/test_eventlet.py index 9e6b699..a77f772 100644 --- a/tests/test_eventlet.py +++ b/tests/test_eventlet.py @@ -1,6 +1,106 @@ import eventlet import tests +def slow_append(result, value, delay): + eventlet.sleep(delay) + result.append(value) + return value * 10 + +def slow_error(delay): + eventlet.sleep(delay) + raise ValueError("error") + +try: + import asyncio + + exec('''if 1: + @asyncio.coroutine + def wait_greenthread(gt, loop=None): + if loop is None: + loop = asyncio.get_event_loop() + fut = asyncio.Future(loop=loop) + + def copy_result(gt): + try: + value = gt.wait() + except Exception as exc: + loop.call_soon_threadsafe(fut.set_exception, exc) + else: + loop.call_soon_threadsafe(fut.set_result, value) + gt.link(copy_result) + + value = yield from fut + return value + + @asyncio.coroutine + def coro_chain_greenthread(): + result = [] + loop = asyncio.get_event_loop() + + g1 = eventlet.spawn(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) + value = yield from wait_greenthread(g2, loop=loop) + result.append(value) + + g3 = eventlet.spawn(slow_error, 0.001) + try: + yield from wait_greenthread(g3, loop=loop) + except ValueError as exc: + result.append(str(exc)) + + result.append(4) + return result + ''') +except ImportError: + import trollius as asyncio + from trollius import From, Return + + @asyncio.coroutine + def wait_greenthread(gt, loop=None): + if loop is None: + loop = asyncio.get_event_loop() + fut = asyncio.Future(loop=loop) + + def copy_result(gt): + try: + value = gt.wait() + except Exception as exc: + loop.call_soon_threadsafe(fut.set_exception, exc) + else: + loop.call_soon_threadsafe(fut.set_result, value) + gt.link(copy_result) + + value = yield From(fut) + raise Return(value) + + @asyncio.coroutine + def coro_chain_greenthread(): + result = [] + loop = asyncio.get_event_loop() + + g1 = eventlet.spawn(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) + value = yield From(wait_greenthread(g2, loop=loop)) + result.append(value) + + g3 = eventlet.spawn(slow_error, 0.001) + try: + yield From(wait_greenthread(g3, loop=loop)) + except ValueError as exc: + result.append(str(exc)) + + result.append(4) + raise Return(result) + + class EventletTests(tests.TestCase): def test_stop(self): def func(): @@ -44,6 +144,10 @@ class EventletTests(tests.TestCase): self.loop.run_forever() self.assertEqual(result, ["spawn", "spawn_after"]) + def test_coro_chain_greenthread(self): + result = self.loop.run_until_complete(coro_chain_greenthread()) + self.assertEqual(result, [1, 10, 2, 20, 'error', 4]) + if __name__ == '__main__': import unittest |