diff options
author | Yury Selivanov <yselivanov@sprymix.com> | 2015-11-16 20:12:10 (GMT) |
---|---|---|
committer | Yury Selivanov <yselivanov@sprymix.com> | 2015-11-16 20:12:10 (GMT) |
commit | a4afc4876b660b5472ae8ca8c76d0a3db27ceac6 (patch) | |
tree | e68d7570affbfd57e4b0f5503836c9af9a9e1bd0 /Lib/asyncio | |
parent | 1744d5393074d5793563585b9a80921e741b7460 (diff) | |
download | cpython-a4afc4876b660b5472ae8ca8c76d0a3db27ceac6.zip cpython-a4afc4876b660b5472ae8ca8c76d0a3db27ceac6.tar.gz cpython-a4afc4876b660b5472ae8ca8c76d0a3db27ceac6.tar.bz2 |
asyncio: Optimize Task._wakeup
See https://github.com/python/asyncio/pull/289 for details.
Diffstat (limited to 'Lib/asyncio')
-rw-r--r-- | Lib/asyncio/tasks.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 77a93e0..21940f6 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -93,6 +93,7 @@ class Task(futures.Future): futures.Future.__del__(self) def _repr_info(self): + # Private method, do not use it. info = super()._repr_info() if self._must_cancel: @@ -221,6 +222,7 @@ class Task(futures.Future): return True def _step(self, value=None, exc=None): + # Private method, do not use it. assert not self.done(), \ '_step(): already done: {!r}, {!r}, {!r}'.format(self, value, exc) if self._must_cancel: @@ -284,13 +286,20 @@ class Task(futures.Future): self = None # Needed to break cycles when an exception occurs. def _wakeup(self, future): + # Private method, do not use it. try: - value = future.result() + future.result() except Exception as exc: # This may also be a cancellation. self._step(None, exc) else: - self._step(value, None) + # Don't pass the value of `future.result()` explicitly, + # as `Future.__iter__` and `Future.__await__` don't need it. + # If we call `_step(value, None)` instead of `_step()`, + # Python eval loop would use `.send(value)` method call, + # instead of `__next__()`, which is slower for futures + # that return non-generator iterators from their `__iter__`. + self._step() self = None # Needed to break cycles when an exception occurs. |