summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio/tasks.py
diff options
context:
space:
mode:
authorINADA Naoki <methane@users.noreply.github.com>2017-05-11 12:56:42 (GMT)
committerGitHub <noreply@github.com>2017-05-11 12:56:42 (GMT)
commit3dc7c52a9f4fb83be3e26e31e2c7cd9dc1cb41a2 (patch)
tree8b20f9ecf036824ee1e6fbd08b890f4024d7531b /Lib/asyncio/tasks.py
parenta4465a5bd08f232cf097893006118c82975c3402 (diff)
downloadcpython-3dc7c52a9f4fb83be3e26e31e2c7cd9dc1cb41a2.zip
cpython-3dc7c52a9f4fb83be3e26e31e2c7cd9dc1cb41a2.tar.gz
cpython-3dc7c52a9f4fb83be3e26e31e2c7cd9dc1cb41a2.tar.bz2
bpo-30048: asyncio: fix Task.cancel() was ignored. (GH-1546)
when there are no more `await` or `yield (from)` before return in coroutine, cancel was ignored. example: async def coro(): asyncio.Task.current_task().cancel() return 42 ... res = await coro() # should raise CancelledError (cherry picked from commit 991adca012f5e106c2d4040ce619c696ba6f9c46)
Diffstat (limited to 'Lib/asyncio/tasks.py')
-rw-r--r--Lib/asyncio/tasks.py7
1 files changed, 6 insertions, 1 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index f91e70a..d7867d1 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -180,7 +180,12 @@ class Task(futures.Future):
else:
result = coro.throw(exc)
except StopIteration as exc:
- self.set_result(exc.value)
+ if self._must_cancel:
+ # Task is cancelled right before coro stops.
+ self._must_cancel = False
+ self.set_exception(futures.CancelledError())
+ else:
+ self.set_result(exc.value)
except futures.CancelledError:
super().cancel() # I.e., Future.cancel(self).
except Exception as exc: