kopia lustrzana https://github.com/micropython/micropython
extmod/uasyncio: Fix gather returning exceptions from a cancelled task.
Fixes issue #5882.pull/5899/head
rodzic
5cf71b5596
commit
43d08688c3
|
@ -66,7 +66,7 @@ async def gather(*aws, return_exceptions=False):
|
||||||
# # cancel all waiting tasks
|
# # cancel all waiting tasks
|
||||||
# raise er
|
# raise er
|
||||||
ts[i] = await ts[i]
|
ts[i] = await ts[i]
|
||||||
except Exception as er:
|
except (core.CancelledError, Exception) as er:
|
||||||
if return_exceptions:
|
if return_exceptions:
|
||||||
ts[i] = er
|
ts[i] = er
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -22,8 +22,9 @@ async def factorial(name, number):
|
||||||
|
|
||||||
async def task(id):
|
async def task(id):
|
||||||
print("start", id)
|
print("start", id)
|
||||||
await asyncio.sleep(0.2)
|
await asyncio.sleep(0.02)
|
||||||
print("end", id)
|
print("end", id)
|
||||||
|
return id
|
||||||
|
|
||||||
|
|
||||||
async def gather_task():
|
async def gather_task():
|
||||||
|
@ -36,12 +37,17 @@ async def main():
|
||||||
# Simple gather with return values
|
# Simple gather with return values
|
||||||
print(await asyncio.gather(factorial("A", 2), factorial("B", 3), factorial("C", 4)))
|
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
|
# Cancel a multi gather
|
||||||
# TODO doesn't work, Task should not forward cancellation from gather to sub-task
|
# 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
|
# but rather CancelledError should cancel the gather directly, which will then cancel
|
||||||
# all sub-tasks explicitly
|
# all sub-tasks explicitly
|
||||||
# t = asyncio.create_task(gather_task())
|
# t = asyncio.create_task(gather_task())
|
||||||
# await asyncio.sleep(0.1)
|
# await asyncio.sleep(0.01)
|
||||||
# t.cancel()
|
# t.cancel()
|
||||||
# await asyncio.sleep(0.01)
|
# await asyncio.sleep(0.01)
|
||||||
|
|
||||||
|
|
|
@ -8,3 +8,6 @@ Task B: factorial(3) = 6
|
||||||
Task C: Compute factorial(4)...
|
Task C: Compute factorial(4)...
|
||||||
Task C: factorial(4) = 24
|
Task C: factorial(4) = 24
|
||||||
[2, 6, 24]
|
[2, 6, 24]
|
||||||
|
start 2
|
||||||
|
end 2
|
||||||
|
[CancelledError(), 2]
|
||||||
|
|
Ładowanie…
Reference in New Issue