]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Use context managers for threading.Lock()
authorHeckad <heckad@yandex.ru>
Wed, 1 Jan 2020 19:47:01 +0000 (14:47 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 3 Jan 2020 18:09:46 +0000 (13:09 -0500)
(zzzeek:) For some reason I thought that threading.Lock() still did
not support context managers, at least in Python 2, however this
does not seem to be the case.

Co-authored-by: Mike Bayer <mike_mp@zzzcomputing.com>
Closes: #5069
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5069
Pull-request-sha: efeac06dda5afdbe33abcf9b27c8b5b5725c8444

Change-Id: Ic64fcd99cd587bc70b4ecc5b45d8205b5c76eff2

lib/sqlalchemy/ext/automap.py
lib/sqlalchemy/ext/declarative/base.py
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/pool/dbapi_proxy.py
lib/sqlalchemy/util/langhelpers.py
lib/sqlalchemy/util/queue.py
test/engine/test_pool.py
test/profiles.txt

index 5fa4e882208a80436c6a00e3bfa1b3896e278201..24c5117c82f7a50a096307f770d3b44c958354c3 100644 (file)
@@ -762,8 +762,7 @@ class AutomapBase(object):
                 autoload_replace=False,
             )
 
-        _CONFIGURE_MUTEX.acquire()
-        try:
+        with _CONFIGURE_MUTEX:
             table_to_map_config = dict(
                 (m.local_table, m)
                 for m in _DeferredMapperConfig.classes_for_base(
@@ -818,8 +817,6 @@ class AutomapBase(object):
 
             for map_config in _DeferredMapperConfig.classes_for_base(cls):
                 map_config.map()
-        finally:
-            _CONFIGURE_MUTEX.release()
 
     _sa_decl_prepare = True
     """Indicate that the mapping of classes should be deferred.
index 622a837363c0163016cafe1d80892d2ff5ea47df..4247c79d7113ccfa5c745da9b2393c17cea3da58 100644 (file)
@@ -179,8 +179,7 @@ class _MapperConfig(object):
 
         self._scan_attributes()
 
-        mapperlib._CONFIGURE_MUTEX.acquire()
-        try:
+        with mapperlib._CONFIGURE_MUTEX:
             clsregistry.add_class(self.classname, self.cls)
 
             self._extract_mappable_attributes()
@@ -192,8 +191,6 @@ class _MapperConfig(object):
             self._setup_inheritance()
 
             self._early_mapping()
-        finally:
-            mapperlib._CONFIGURE_MUTEX.release()
 
     def _early_mapping(self):
         self.map()
index e2eb934095d967b873ef61f61ad4d7865182af4c..e826c004340ba1d8d617ff27e181f34ad41f1a5f 100644 (file)
@@ -231,8 +231,7 @@ def clear_mappers():
     upon a fixed set of classes.
 
     """
-    mapperlib._CONFIGURE_MUTEX.acquire()
-    try:
+    with mapperlib._CONFIGURE_MUTEX:
         while _mapper_registry:
             try:
                 # can't even reliably call list(weakdict) in jython
@@ -240,8 +239,6 @@ def clear_mappers():
                 mapper.dispose()
             except KeyError:
                 pass
-    finally:
-        mapperlib._CONFIGURE_MUTEX.release()
 
 
 joinedload = strategy_options.joinedload._unbound_fn
index c23aaf9ef6731bab902f6e5720d870c8d03a9d2b..1e4f1a2fa759bff0a13d0fad1163a909e3421edd 100644 (file)
@@ -698,8 +698,7 @@ class Mapper(sql_base.HasCacheKey, InspectionAttr):
         # prevent this mapper from being constructed
         # while a configure_mappers() is occurring (and defer a
         # configure_mappers() until construction succeeds)
-        _CONFIGURE_MUTEX.acquire()
-        try:
+        with _CONFIGURE_MUTEX:
             self.dispatch._events._new_mapper_instance(class_, self)
             self._configure_inheritance()
             self._configure_class_instrumentation()
@@ -709,8 +708,6 @@ class Mapper(sql_base.HasCacheKey, InspectionAttr):
             Mapper._new_mappers = True
             self._log("constructed")
             self._expire_memoizations()
-        finally:
-            _CONFIGURE_MUTEX.release()
 
     # major attributes initialized at the classlevel so that
     # they can be Sphinx-documented.
@@ -3167,8 +3164,7 @@ def configure_mappers():
     if not Mapper._new_mappers:
         return
 
-    _CONFIGURE_MUTEX.acquire()
-    try:
+    with _CONFIGURE_MUTEX:
         global _already_compiling
         if _already_compiling:
             return
@@ -3225,8 +3221,6 @@ def configure_mappers():
                 Mapper._new_mappers = False
         finally:
             _already_compiling = False
-    finally:
-        _CONFIGURE_MUTEX.release()
     Mapper.dispatch._for_class(Mapper).after_configured()
 
 
index d78d85d1fce48533df5ab71a33f7159034b13f47..77f567515ed40efd9796a2171ec3561297b8d9d8 100644 (file)
@@ -104,8 +104,7 @@ class _DBProxy(object):
         try:
             return self.pools[key]
         except KeyError:
-            self._create_pool_mutex.acquire()
-            try:
+            with self._create_pool_mutex:
                 if key not in self.pools:
                     kw.pop("sa_pool_key", None)
                     pool = self.poolclass(
@@ -115,8 +114,6 @@ class _DBProxy(object):
                     return pool
                 else:
                     return self.pools[key]
-            finally:
-                self._create_pool_mutex.release()
 
     def connect(self, *args, **kw):
         """Activate a connection to the database.
index 83f119660cf067de8b28fad087e9a3808b616c42..8124764be89321093a981050184948902f7b28ed 100644 (file)
@@ -1179,11 +1179,8 @@ def counter():
 
     # avoid the 2to3 "next" transformation...
     def _next():
-        lock.acquire()
-        try:
+        with lock:
             return next(counter)
-        finally:
-            lock.release()
 
     return _next
 
@@ -1362,14 +1359,11 @@ class symbol(object):
     _lock = compat.threading.Lock()
 
     def __new__(cls, name, doc=None, canonical=None):
-        cls._lock.acquire()
-        try:
+        with cls._lock:
             sym = cls.symbols.get(name)
             if sym is None:
                 cls.symbols[name] = sym = _symbol(name, doc, canonical)
             return sym
-        finally:
-            symbol._lock.release()
 
     @classmethod
     def parse_user_argument(
index 819d95684e8490b4f262d19e8b5ab3fa23d33aa5..78b7351d4efaa87198ff17a3372f57ad125e71c1 100644 (file)
@@ -66,28 +66,22 @@ class Queue:
     def qsize(self):
         """Return the approximate size of the queue (not reliable!)."""
 
-        self.mutex.acquire()
-        n = self._qsize()
-        self.mutex.release()
-        return n
+        with self.mutex:
+            return self._qsize()
 
     def empty(self):
         """Return True if the queue is empty, False otherwise (not
         reliable!)."""
 
-        self.mutex.acquire()
-        n = self._empty()
-        self.mutex.release()
-        return n
+        with self.mutex:
+            return self._empty()
 
     def full(self):
         """Return True if the queue is full, False otherwise (not
         reliable!)."""
 
-        self.mutex.acquire()
-        n = self._full()
-        self.mutex.release()
-        return n
+        with self.mutex:
+            return self._full()
 
     def put(self, item, block=True, timeout=None):
         """Put an item into the queue.
@@ -102,8 +96,7 @@ class Queue:
         (`timeout` is ignored in that case).
         """
 
-        self.not_full.acquire()
-        try:
+        with self.not_full:
             if not block:
                 if self._full():
                     raise Full
@@ -121,8 +114,6 @@ class Queue:
                     self.not_full.wait(remaining)
             self._put(item)
             self.not_empty.notify()
-        finally:
-            self.not_full.release()
 
     def put_nowait(self, item):
         """Put an item into the queue without blocking.
@@ -142,9 +133,9 @@ class Queue:
         available within that time.  Otherwise (`block` is false),
         return an item if one is immediately available, else raise the
         ``Empty`` exception (`timeout` is ignored in that case).
+
         """
-        self.not_empty.acquire()
-        try:
+        with self.not_empty:
             if not block:
                 if self._empty():
                     raise Empty
@@ -163,8 +154,6 @@ class Queue:
             item = self._get()
             self.not_full.notify()
             return item
-        finally:
-            self.not_empty.release()
 
     def get_nowait(self):
         """Remove and return an item from the queue without blocking.
index 31b89373492315ca1fdaa89462fd4c36d46dbdc4..e4d6dba5736866e8af1319d59e2ea2e416565963 100644 (file)
@@ -970,11 +970,8 @@ class QueuePoolTest(PoolTestBase):
         dbapi = MockDBAPI()
 
         def creator():
-            mutex.acquire()
-            try:
+            with mutex:
                 return dbapi.connect()
-            finally:
-                mutex.release()
 
         success = []
         for timeout in (None, 30):
index 08f8874a23ad8cf1cc90a786dc06342eeb2d7137..dac0b3c25b180cc4253a49ce675b992a462d20f6 100644 (file)
@@ -764,51 +764,52 @@ test.aaa_profiling.test_orm.SessionTest.test_expire_lots 3.7_sqlite_pysqlite_dba
 
 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect
 
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mysql_pymysql_dbapiunicode_nocextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 96
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_sqlite_pysqlite_dbapiunicode_cextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 97
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mssql_pyodbc_dbapiunicode_cextensions 82
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mssql_pyodbc_dbapiunicode_nocextensions 82
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_mysqldb_dbapiunicode_cextensions 81
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_mysqldb_dbapiunicode_nocextensions 81
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mysql_mysqldb_dbapiunicode_nocextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_mysql_pymysql_dbapiunicode_nocextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_sqlite_pysqlite_dbapiunicode_cextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 103
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mssql_pyodbc_dbapiunicode_cextensions 86
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mssql_pyodbc_dbapiunicode_nocextensions 86
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_mysqldb_dbapiunicode_cextensions 86
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_mysqldb_dbapiunicode_nocextensions 86
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_pymysql_dbapiunicode_cextensions 82
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_mysql_pymysql_dbapiunicode_nocextensions 82
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 82
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 86
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 86
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_postgresql_psycopg2_dbapiunicode_cextensions 82
 test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 82
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_sqlite_pysqlite_dbapiunicode_cextensions 82
-test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 82
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_sqlite_pysqlite_dbapiunicode_cextensions 86
+test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 86
 
 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect
 
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mysql_pymysql_dbapiunicode_nocextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_sqlite_pysqlite_dbapiunicode_cextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 31
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mssql_pyodbc_dbapiunicode_cextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mssql_pyodbc_dbapiunicode_nocextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_mysqldb_dbapiunicode_cextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_mysqldb_dbapiunicode_nocextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_pymysql_dbapiunicode_cextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_pymysql_dbapiunicode_nocextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_postgresql_psycopg2_dbapiunicode_cextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_sqlite_pysqlite_dbapiunicode_cextensions 23
-test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 23
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mssql_pyodbc_dbapiunicode_cextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mssql_pyodbc_dbapiunicode_nocextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_mysql_pymysql_dbapiunicode_nocextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_oracle_cx_oracle_dbapiunicode_cextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_oracle_cx_oracle_dbapiunicode_nocextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_postgresql_psycopg2_dbapiunicode_cextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_postgresql_psycopg2_dbapiunicode_nocextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_sqlite_pysqlite_dbapiunicode_cextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 2.7_sqlite_pysqlite_dbapiunicode_nocextensions 33
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mssql_pyodbc_dbapiunicode_cextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mssql_pyodbc_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_mysqldb_dbapiunicode_cextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_mysqldb_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_pymysql_dbapiunicode_cextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_mysql_pymysql_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_oracle_cx_oracle_dbapiunicode_cextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_oracle_cx_oracle_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_postgresql_psycopg2_dbapiunicode_cextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_postgresql_psycopg2_dbapiunicode_nocextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_sqlite_pysqlite_dbapiunicode_cextensions 25
+test.aaa_profiling.test_pool.QueuePoolTest.test_second_connect 3.7_sqlite_pysqlite_dbapiunicode_nocextensions 25
 
 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_second_samethread_connect