QUERY · ISSUE
uasyncio: Code throws exception under CPython
extmod
MicroPython allows a task to be created before issuing .run() but CPython throws an exception.
try:
import uasyncio as asyncio
except ImportError:
import asyncio
async def foo():
await asyncio.sleep(3)
async def bar():
await foo_task
foo_task = asyncio.create_task(foo()) # Naughty code here...
asyncio.run(bar())
Outcome under CPython 3.8.0:
adminpete@debian8:/mnt/qnap2/temp$ python3 -m rats_x
Traceback (most recent call last):
File "/usr/local/lib/python3.8/runpy.py", line 192, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/local/lib/python3.8/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/mnt/qnap2/temp/rats_x.py", line 12, in <module>
foo_task = asyncio.create_task(foo())
File "/usr/local/lib/python3.8/asyncio/tasks.py", line 381, in create_task
loop = events.get_running_loop()
RuntimeError: no running event loop
sys:1: RuntimeWarning: coroutine 'foo' was never awaited
My view is that this doesn't matter, but I thought it worth reporting.
CANDIDATE · ISSUE
uasyncio gather() return_exceptions behaviour differs from CPython
extmod
I think this is a regression. The following script produces an unexpected result in MicroPython:
try:
import uasyncio as asyncio
except ImportError:
import asyncio
async def will_stop(n):
print('Runs to completion')
for _ in range(6):
await asyncio.sleep(1)
return 2 * n
async def forever(n):
print('forever() will be cancelled')
while True:
await asyncio.sleep(1)
n += 1
return n
async def do_cancel(task):
await asyncio.sleep(3)
print('About to cancel forever')
task.cancel()
async def main():
tasks = [asyncio.create_task(forever(70))]
tasks.append(will_stop(21))
asyncio.create_task(do_cancel(tasks[0]))
res = None
try:
res = await asyncio.gather(*tasks, return_exceptions=True)
except asyncio.CancelledError:
print('Cancelled')
print('Result: ', res)
asyncio.run(main())
CPython (expected behaviour):
adminpete@debian8:/mnt/qnap2/temp$ python3
Python 3.8.0 (default, Dec 6 2019, 16:20:13)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import rats40
forever() will be cancelled
Runs to completion
About to cancel forever
Result: [CancelledError(), 42]
>>>
MicroPython (behaves as if return_exceptions==False):
MicroPython v1.17 on 2021-09-02; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>> import rats40
forever() will be cancelled
Runs to completion
About to cancel forever
Cancelled
Result: None
>>>