diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-11-02 17:37:12 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-11-03 13:56:02 -0500 |
commit | f016c1ac7f93d2f759aff53ec1494658efd7b496 (patch) | |
tree | 83f3e05b83d30c93d1e0beaf175dac38d33f54c7 /lib/sqlalchemy/util/concurrency.py | |
parent | e34886f137a3daf594d34cf5aa9b427de2ad6b98 (diff) | |
download | sqlalchemy-f016c1ac7f93d2f759aff53ec1494658efd7b496.tar.gz |
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
Diffstat (limited to 'lib/sqlalchemy/util/concurrency.py')
-rw-r--r-- | lib/sqlalchemy/util/concurrency.py | 47 |
1 files changed, 31 insertions, 16 deletions
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() |