diff options
Diffstat (limited to 'lib/sqlalchemy/util/_concurrency_py3k.py')
-rw-r--r-- | lib/sqlalchemy/util/_concurrency_py3k.py | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/sqlalchemy/util/_concurrency_py3k.py b/lib/sqlalchemy/util/_concurrency_py3k.py index b905f903b..5f03972b2 100644 --- a/lib/sqlalchemy/util/_concurrency_py3k.py +++ b/lib/sqlalchemy/util/_concurrency_py3k.py @@ -7,6 +7,7 @@ from typing import Coroutine import greenlet from . import compat +from .langhelpers import memoized_property from .. import exc @@ -132,10 +133,15 @@ async def greenlet_spawn( class AsyncAdaptedLock: - def __init__(self): - self.mutex = asyncio.Lock() + @memoized_property + def mutex(self): + # there should not be a race here for coroutines creating the + # new lock as we are not using await, so therefore no concurrency + return asyncio.Lock() def __enter__(self): + # await is used to acquire the lock only after the first calling + # coroutine has created the mutex. await_fallback(self.mutex.acquire()) return self |