contextlib.closing()线程是否安全 - Python

时间:2017-12-08 06:13:34

标签: multithreading python-3.x

我在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

1 个答案:

答案 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

第一个语句采用先例就像嵌套它们一样。