1# mode: run 2# tag: asyncio, pep492 3 4""" 5PYTHON setup.py build_ext -i 6PYTHON test_from_import.py 7PYTHON test_import.py 8PYTHON test_async_def.py 9PYTHON test_async_def_future.py 10PYTHON test_all.py 11""" 12 13######## setup.py ######## 14 15from Cython.Build.Dependencies import cythonize 16from distutils.core import setup 17 18setup( 19 ext_modules = cythonize("*.pyx"), 20) 21 22 23######## test_from_import.py ######## 24 25import from_asyncio_import 26import asyncio 27 28def runloop(task): 29 loop = asyncio.get_event_loop() 30 result = loop.run_until_complete(task()) 31 assert 3 == result, result 32 33import sys 34if sys.version_info < (3, 7): 35 runloop(from_asyncio_import.wait3) 36 37 38######## test_import.py ######## 39 40import import_asyncio 41import asyncio 42 43def runloop(task): 44 loop = asyncio.get_event_loop() 45 result = loop.run_until_complete(task()) 46 assert 3 == result, result 47 48import sys 49if sys.version_info < (3, 7): 50 runloop(import_asyncio.wait3) 51 52 53######## test_async_def.py ######## 54 55import sys 56 57ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) 58 59if ASYNCIO_SUPPORTS_COROUTINE: 60 import async_def 61 import asyncio 62 63 def runloop(task): 64 loop = asyncio.get_event_loop() 65 result = loop.run_until_complete(task()) 66 assert 3 == result, result 67 68 runloop(async_def.wait3) 69 70 71######## test_async_def_future.py ######## 72 73import sys 74 75ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) 76 77if ASYNCIO_SUPPORTS_COROUTINE: 78 from async_def_future import await_future 79 import asyncio 80 81 def runloop(): 82 loop = asyncio.get_event_loop() 83 task, events, expected = await_future(loop) 84 result = loop.run_until_complete(task()) 85 assert events == expected, 'expected %s, got %s' % (expected, events) 86 87 runloop() 88 89 90######## test_all.py ######## 91 92import sys 93import asyncio 94 95ASYNCIO_SUPPORTS_COROUTINE = sys.version_info[:2] >= (3, 5) 96ASYNCIO_SUPPORTS_YIELD_FROM = sys.version_info[:2] < (3, 7) 97 98def runloop(task): 99 loop = asyncio.get_event_loop() 100 result = loop.run_until_complete(task()) 101 assert 3 == result, result 102 103import import_asyncio 104if ASYNCIO_SUPPORTS_YIELD_FROM: 105 runloop(import_asyncio.wait3) # 1a) 106import from_asyncio_import 107if ASYNCIO_SUPPORTS_YIELD_FROM: 108 runloop(from_asyncio_import.wait3) # 1b) 109 110import async_def 111if ASYNCIO_SUPPORTS_COROUTINE: 112 runloop(async_def.wait3) # 1c) 113 114if ASYNCIO_SUPPORTS_YIELD_FROM: 115 runloop(from_asyncio_import.wait3) # 2a) 116 runloop(import_asyncio.wait3) # 2b) 117if ASYNCIO_SUPPORTS_COROUTINE: 118 runloop(async_def.wait3) # 2c) 119 120import sys 121if ASYNCIO_SUPPORTS_YIELD_FROM: 122 runloop(from_asyncio_import.wait3) # 3a) 123 runloop(import_asyncio.wait3) # 3b) 124if ASYNCIO_SUPPORTS_COROUTINE: 125 runloop(async_def.wait3) # 3c) 126 127try: 128 from collections.abc import Generator 129except ImportError: 130 try: 131 from collections import Generator 132 except ImportError: 133 assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Generator" 134 Generator = object # easy win :) 135 136assert isinstance(from_asyncio_import.wait3(), Generator) 137assert isinstance(import_asyncio.wait3(), Generator) 138assert isinstance((lambda:(yield))(), Generator) 139 140try: 141 from collections.abc import Awaitable 142except ImportError: 143 try: 144 from collections import Awaitable 145 except ImportError: 146 assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Awaitable" 147 Awaitable = object # easy win :) 148 149assert isinstance(async_def.wait3(), Awaitable) 150 151try: 152 from collections.abc import Coroutine 153except ImportError: 154 try: 155 from collections import Coroutine 156 except ImportError: 157 assert sys.version_info < (3,5), "Python 3.5+ should have collections.abc.Coroutine" 158 Coroutine = object # easy win :) 159 160assert isinstance(async_def.wait3(), Coroutine) 161 162 163######## import_asyncio.pyx ######## 164# cython: binding=True 165 166try: 167 from types import coroutine as types_coroutine 168except ImportError: 169 types_coroutine = lambda f:f 170 171import asyncio 172 173@asyncio.coroutine 174@types_coroutine 175def wait3(): 176 counter = 0 177 for i in range(3): 178 print(counter) 179 yield from asyncio.sleep(0.01) 180 counter += 1 181 return counter 182 183 184######## from_asyncio_import.pyx ######## 185# cython: binding=True 186 187try: 188 from types import coroutine as types_coroutine 189except ImportError: 190 types_coroutine = lambda f:f 191 192from asyncio import coroutine, sleep 193 194@coroutine 195@types_coroutine 196def wait3(): 197 counter = 0 198 for i in range(3): 199 print(counter) 200 yield from sleep(0.01) 201 counter += 1 202 return counter 203 204 205######## async_def.pyx ######## 206# cython: binding=True 207 208import asyncio 209 210async def wait3(): 211 counter = 0 212 for i in range(3): 213 print(counter) 214 await asyncio.sleep(0.01) 215 counter += 1 216 return counter 217 218 219######## async_def_future.pyx ######## 220# cython: binding=True 221 222import asyncio 223 224def await_future(loop): 225 events = [] 226 async def worker(): 227 fut = asyncio.Future() 228 229 def setval(): 230 events.append('setval') 231 fut.set_result(123) 232 233 events.append('setup') 234 loop.call_later(0.2, setval) 235 events.append(await fut) 236 237 async def test(): 238 await worker() 239 240 expected = ['setup', 'setval', 123] 241 return test, events, expected 242