From: Heckad Date: Wed, 1 Jan 2020 19:47:01 +0000 (-0500) Subject: Use context managers for threading.Lock() X-Git-Tag: rel_1_4_0b1~571^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a076b1f30406cbb59a55e2c01ddd17a84636778e;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Use context managers for threading.Lock() (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 Closes: #5069 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5069 Pull-request-sha: efeac06dda5afdbe33abcf9b27c8b5b5725c8444 Change-Id: Ic64fcd99cd587bc70b4ecc5b45d8205b5c76eff2 --- diff --git a/lib/sqlalchemy/ext/automap.py b/lib/sqlalchemy/ext/automap.py index 5fa4e88220..24c5117c82 100644 --- a/lib/sqlalchemy/ext/automap.py +++ b/lib/sqlalchemy/ext/automap.py @@ -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. diff --git a/lib/sqlalchemy/ext/declarative/base.py b/lib/sqlalchemy/ext/declarative/base.py index 622a837363..4247c79d71 100644 --- a/lib/sqlalchemy/ext/declarative/base.py +++ b/lib/sqlalchemy/ext/declarative/base.py @@ -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() diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py index e2eb934095..e826c00434 100644 --- a/lib/sqlalchemy/orm/__init__.py +++ b/lib/sqlalchemy/orm/__init__.py @@ -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 diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index c23aaf9ef6..1e4f1a2fa7 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -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() diff --git a/lib/sqlalchemy/pool/dbapi_proxy.py b/lib/sqlalchemy/pool/dbapi_proxy.py index d78d85d1fc..77f567515e 100644 --- a/lib/sqlalchemy/pool/dbapi_proxy.py +++ b/lib/sqlalchemy/pool/dbapi_proxy.py @@ -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. diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py index 83f119660c..8124764be8 100644 --- a/lib/sqlalchemy/util/langhelpers.py +++ b/lib/sqlalchemy/util/langhelpers.py @@ -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( diff --git a/lib/sqlalchemy/util/queue.py b/lib/sqlalchemy/util/queue.py index 819d95684e..78b7351d4e 100644 --- a/lib/sqlalchemy/util/queue.py +++ b/lib/sqlalchemy/util/queue.py @@ -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. diff --git a/test/engine/test_pool.py b/test/engine/test_pool.py index 31b8937349..e4d6dba573 100644 --- a/test/engine/test_pool.py +++ b/test/engine/test_pool.py @@ -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): diff --git a/test/profiles.txt b/test/profiles.txt index 08f8874a23..dac0b3c25b 100644 --- a/test/profiles.txt +++ b/test/profiles.txt @@ -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