mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
asyncio: Optimize Task._wakeup
See https://github.com/python/asyncio/pull/289 for details.
This commit is contained in:
parent
1744d53930
commit
a4afc4876b
1 changed files with 11 additions and 2 deletions
|
@ -93,6 +93,7 @@ class Task(futures.Future):
|
||||||
futures.Future.__del__(self)
|
futures.Future.__del__(self)
|
||||||
|
|
||||||
def _repr_info(self):
|
def _repr_info(self):
|
||||||
|
# Private method, do not use it.
|
||||||
info = super()._repr_info()
|
info = super()._repr_info()
|
||||||
|
|
||||||
if self._must_cancel:
|
if self._must_cancel:
|
||||||
|
@ -221,6 +222,7 @@ class Task(futures.Future):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _step(self, value=None, exc=None):
|
def _step(self, value=None, exc=None):
|
||||||
|
# Private method, do not use it.
|
||||||
assert not self.done(), \
|
assert not self.done(), \
|
||||||
'_step(): already done: {!r}, {!r}, {!r}'.format(self, value, exc)
|
'_step(): already done: {!r}, {!r}, {!r}'.format(self, value, exc)
|
||||||
if self._must_cancel:
|
if self._must_cancel:
|
||||||
|
@ -284,13 +286,20 @@ class Task(futures.Future):
|
||||||
self = None # Needed to break cycles when an exception occurs.
|
self = None # Needed to break cycles when an exception occurs.
|
||||||
|
|
||||||
def _wakeup(self, future):
|
def _wakeup(self, future):
|
||||||
|
# Private method, do not use it.
|
||||||
try:
|
try:
|
||||||
value = future.result()
|
future.result()
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
# This may also be a cancellation.
|
# This may also be a cancellation.
|
||||||
self._step(None, exc)
|
self._step(None, exc)
|
||||||
else:
|
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.
|
self = None # Needed to break cycles when an exception occurs.
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue