summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util/concurrency.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-11-02 17:37:12 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2020-11-03 13:56:02 -0500
commitf016c1ac7f93d2f759aff53ec1494658efd7b496 (patch)
tree83f3e05b83d30c93d1e0beaf175dac38d33f54c7 /lib/sqlalchemy/util/concurrency.py
parente34886f137a3daf594d34cf5aa9b427de2ad6b98 (diff)
downloadsqlalchemy-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.py47
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()