我在Python&中读到了with
语句。理解with
声明将确保在完成工作时关闭资源。
我正在执行一些数据库操作&使用with语句管理connection
。但是,我不确定线程的安全性。
with contextlib.closing(sqlite3.connect(self.dbName)) as connection:
# Do Something
我还使用threading
喜欢
with
lock = threading.Lock()
with lock:
#Do Something
我想知道context.closing()
是否能够处理多线程,或者我是否必须致电threading.Lock()
&除了context.closing()
之外还要锁定
lock = threading.Lock()
with lock:
with contextlib.closing(sqlite3.connect(self.dbName)) as connection:
# Do Something
答案 0 :(得分:0)
contextlib.closing
语法之外, with ...
与线程和线程锁无关。它本质上是一种方便的简写:
try:
connection = sqlite3.connect(self.dbName)
# code within the `with` block
connection.close()
except:
connection.close()
因此,如果您希望在contextlib.closing
,hmm,上下文中执行的任何内容具有独占线程访问权限,则您必须使用{{ 1}}(或threading.Lock
)来确保它。
请注意,订单或嵌套至关重要:
threading.RLock
确保一次只有一个线程可以获取连接,并且做某事,同时:
with lock:
with contextlib.closing(sqlite3.connect(self.dbName)) as connection:
# Do Something
意味着任何线程都可以获得连接,但只有一个线程可以一次 Do Something 。
P.S。为避免嵌套地狱,您可以将with语句堆叠在一起:
with contextlib.closing(sqlite3.connect(self.dbName)) as connection:
with lock:
# Do Something
第一个语句采用先例就像嵌套它们一样。