extmod/uasyncio: Fix gather returning exceptions from a cancelled task.
Fixes issue #5882.
This commit is contained in:
parent
5cf71b5596
commit
43d08688c3
|
@ -66,7 +66,7 @@ async def gather(*aws, return_exceptions=False):
|
|||
# # cancel all waiting tasks
|
||||
# raise er
|
||||
ts[i] = await ts[i]
|
||||
except Exception as er:
|
||||
except (core.CancelledError, Exception) as er:
|
||||
if return_exceptions:
|
||||
ts[i] = er
|
||||
else:
|
||||
|
|
|
@ -22,8 +22,9 @@ async def factorial(name, number):
|
|||
|
||||
async def task(id):
|
||||
print("start", id)
|
||||
await asyncio.sleep(0.2)
|
||||
await asyncio.sleep(0.02)
|
||||
print("end", id)
|
||||
return id
|
||||
|
||||
|
||||
async def gather_task():
|
||||
|
@ -36,12 +37,17 @@ async def main():
|
|||
# Simple gather with return values
|
||||
print(await asyncio.gather(factorial("A", 2), factorial("B", 3), factorial("C", 4)))
|
||||
|
||||
# Test return_exceptions, where one task is cancelled and the other finishes normally
|
||||
tasks = [asyncio.create_task(task(1)), asyncio.create_task(task(2))]
|
||||
tasks[0].cancel()
|
||||
print(await asyncio.gather(*tasks, return_exceptions=True))
|
||||
|
||||
# Cancel a multi gather
|
||||
# TODO doesn't work, Task should not forward cancellation from gather to sub-task
|
||||
# but rather CancelledError should cancel the gather directly, which will then cancel
|
||||
# all sub-tasks explicitly
|
||||
# t = asyncio.create_task(gather_task())
|
||||
# await asyncio.sleep(0.1)
|
||||
# await asyncio.sleep(0.01)
|
||||
# t.cancel()
|
||||
# await asyncio.sleep(0.01)
|
||||
|
||||
|
|
|
@ -8,3 +8,6 @@ Task B: factorial(3) = 6
|
|||
Task C: Compute factorial(4)...
|
||||
Task C: factorial(4) = 24
|
||||
[2, 6, 24]
|
||||
start 2
|
||||
end 2
|
||||
[CancelledError(), 2]
|
||||
|
|
Loading…
Reference in New Issue