diff options
author | Yury Selivanov <yury@magic.io> | 2017-12-19 12:18:45 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-19 12:18:45 (GMT) |
commit | a9d7e552c72b6e9515e76a1dd4b247da86da23de (patch) | |
tree | e2f05acc41f3eb90bbd29377957867adff5f79c9 /Lib/asyncio/coroutines.py | |
parent | a7bd64c0c01379e9b82e86ad41a301329a0775d9 (diff) | |
download | cpython-a9d7e552c72b6e9515e76a1dd4b247da86da23de.zip cpython-a9d7e552c72b6e9515e76a1dd4b247da86da23de.tar.gz cpython-a9d7e552c72b6e9515e76a1dd4b247da86da23de.tar.bz2 |
bpo-32357: Optimize asyncio.iscoroutine() for non-native coroutines (#4915)
Diffstat (limited to 'Lib/asyncio/coroutines.py')
-rw-r--r-- | Lib/asyncio/coroutines.py | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index e3c0162..9c860a4 100644 --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -1,5 +1,6 @@ __all__ = 'coroutine', 'iscoroutinefunction', 'iscoroutine' +import collections.abc import functools import inspect import os @@ -7,8 +8,6 @@ import sys import traceback import types -from collections.abc import Awaitable, Coroutine - from . import base_futures from . import constants from . import format_helpers @@ -162,7 +161,7 @@ def coroutine(func): except AttributeError: pass else: - if isinstance(res, Awaitable): + if isinstance(res, collections.abc.Awaitable): res = yield from await_meth() return res @@ -199,12 +198,24 @@ def iscoroutinefunction(func): # Prioritize native coroutine check to speed-up # asyncio.iscoroutine. _COROUTINE_TYPES = (types.CoroutineType, types.GeneratorType, - Coroutine, CoroWrapper) + collections.abc.Coroutine, CoroWrapper) +_iscoroutine_typecache = set() def iscoroutine(obj): """Return True if obj is a coroutine object.""" - return isinstance(obj, _COROUTINE_TYPES) + if type(obj) in _iscoroutine_typecache: + return True + + if isinstance(obj, _COROUTINE_TYPES): + # Just in case we don't want to cache more than 100 + # positive types. That shouldn't ever happen, unless + # someone stressing the system on purpose. + if len(_iscoroutine_typecache) < 100: + _iscoroutine_typecache.add(type(obj)) + return True + else: + return False def _format_coroutine(coro): |