From f016c1ac7f93d2f759aff53ec1494658efd7b496 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 2 Nov 2020 17:37:12 -0500 Subject: Reduce import time overhead * Fix subclass traversals to not run classes multiple times * switch compiler visitor to use an attrgetter, to avoid an eval() at startup time * don't pre-generate traversal functions, there's lots of these which are expensive to generate at once and most applications won't use them all; have it generate them on first use instead * Some ideas about removing asyncio imports, they don't seem to be too signficant, apply some more simplicity to the overall "greenlet fallback" situation Fixes: #5681 Change-Id: Ib564ddaddb374787ce3e11ff48026e99ed570933 --- lib/sqlalchemy/util/concurrency.py | 47 +++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 16 deletions(-) (limited to 'lib/sqlalchemy/util/concurrency.py') diff --git a/lib/sqlalchemy/util/concurrency.py b/lib/sqlalchemy/util/concurrency.py index e0883aa68..f78c0971c 100644 --- a/lib/sqlalchemy/util/concurrency.py +++ b/lib/sqlalchemy/util/concurrency.py @@ -1,25 +1,40 @@ from . import compat +have_greenlet = False if compat.py3k: - import asyncio - from ._concurrency_py3k import await_only - from ._concurrency_py3k import await_fallback - from ._concurrency_py3k import greenlet - from ._concurrency_py3k import greenlet_spawn - from ._concurrency_py3k import AsyncAdaptedLock -else: - asyncio = None - greenlet = None - - def await_only(thing): + try: + import greenlet # noqa F401 + except ImportError: + pass + else: + have_greenlet = True + from ._concurrency_py3k import await_only + from ._concurrency_py3k import await_fallback + from ._concurrency_py3k import greenlet_spawn + from ._concurrency_py3k import AsyncAdaptedLock + from ._concurrency_py3k import asyncio # noqa F401 + +if not have_greenlet: + + asyncio = None # noqa F811 + + def _not_implemented(): + if not compat.py3k: + raise ValueError("Cannot use this function in py2.") + else: + raise ValueError( + "the greenlet library is required to use this function." + ) + + def await_only(thing): # noqa F811 return thing - def await_fallback(thing): + def await_fallback(thing): # noqa F81 return thing - def greenlet_spawn(fn, *args, **kw): - raise ValueError("Cannot use this function in py2.") + def greenlet_spawn(fn, *args, **kw): # noqa F81 + _not_implemented() - def AsyncAdaptedLock(*args, **kw): - raise ValueError("Cannot use this function in py2.") + def AsyncAdaptedLock(*args, **kw): # noqa F81 + _not_implemented() -- cgit v1.2.1