2017-12-08 2 views
0

나는 with에 대한 내용을 Python &에 실 었다고 이해하면 with 문은 작업 완료시 자원을 닫아야합니다.contextlib.closing() thread safe - Python

일부 DB 작업 수행 & connection을 (를) 사용하여 with 문을 사용 중입니다. 하지만 스레드 안전성에 대해서는 확신하지 못합니다.

with contextlib.closing(sqlite3.connect(self.dbName)) as connection: 
    # Do Something 

내가 context.closing()는 멀티 스레딩을 처리 할 수 ​​있는지 여부를 알고 싶어하거나 내가 threading.Lock() &이

처럼 context.closing()에 추가 잠금 않는 전화를해야 할 with
lock = threading.Lock() 
with lock: 
    #Do Something 

처럼 나는 또한에 대한 threading 사용하여 읽기
lock = threading.Lock() 
with lock: 
    with contextlib.closing(sqlite3.connect(self.dbName)) as connection: 
     # Do Something 

답변

0

contextlib.closing o 스레드와 스레드 잠금을 제외하고 모두 with ... 구문을 사용할 수 있어야합니다. 그것은 본질적으로의 편의를 속기이다 : 전용 스레드 액세스 할 수 있도록 당신이 흠하는 contextlib.closing 내에서 실행하든 그래서 당신이 원하는 경우

try: 
    connection = sqlite3.connect(self.dbName) 
    # code within the `with` block 
    connection.close() 
except: 
    connection.close() 

, 상황, 당신은 사용해야 할 겁니다 threading.Lock (또는 threading.RLock).

는 주문 또는 중첩 문제로 있다는 사실을 숙지하십시오 :

with lock: 
    with contextlib.closing(sqlite3.connect(self.dbName)) as connection: 
     # Do Something 

는 한 번에 하나의 스레드 만하고 뭔가를 수행에서 연결을 얻을 수 있음을 보장합니다 :

with contextlib.closing(sqlite3.connect(self.dbName)) as connection: 
    with lock: 
     # Do Something 

모든 스레드가 연결을 만들 수 있지만 단일 스레드 만 가질 수 있음을 의미합니다 Do something Wired 한 번에.

P. 중첩 지옥을 피하려면, 당신은 함께 문으로 스택 할 수 있습니다

with lock, contextlib.closing(sqlite3.connect(self.dbName)) as connection: 
    # Do Somehing 

첫 번째 문은 당신이 그들을 중첩하는 것처럼 전례를합니다.

+0

지연 응답을 위해 죄송합니다. 그것은 사물을 이해하는 데 도움이됩니다. 고맙습니다 :) – OO7