Python 사전의 스레드 안전
나는 사전을 가지고 있는 수업이 있습니다.
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
그리고 그 방법을 부르는 4개의 스레드(식당마다 하나씩)를 운영하고 있습니다.OrderBook.addOrder
각 스레드에서 실행되는 함수는 다음과 같습니다.
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
안전합니까, 아니면 전화하기 전에 잠금 장치를 사용해야 합니까?addOrder
?
Python의 내장 구조는 단일 작업에 대해 스레드 세이프이지만 문이 실제로 여러 작업이 되는 위치를 확인하기 어려울 수 있습니다.
코드는 안전해야 합니다.기억하세요: 여기에 자물쇠를 잠글 경우 오버헤드가 거의 발생하지 않으며 안심할 수 있습니다.
자세한 내용은 effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm ://https://web.archive.org/web/20201108091210/http 에서 확인할 수 있습니다.
예, 기본 제공 유형은 본질적으로 스레드 세이프입니다. http://docs.python.org/glossary.html#term-global-interpreter-lock
따라서 객체 모델(dict와 같은 중요한 기본 제공 유형 포함)을 동시 액세스에 대해 암묵적으로 안전하게 만들어 CPython 구현을 단순화합니다.
구글의 스타일 가이드는 독재 원자성에 의존하지 말라고 충고합니다.
이에 대한 자세한 내용은 다음에서 설명합니다. Python 변수 할당은 원자적입니까?
기본 제공 형식의 원자성에 의존하지 마십시오.
사전과 같은 Python의 기본 제공 데이터 유형은 원자적 작업을 수행하는 것처럼 보이지만 원자적이 아닌 경우가 있습니다(예:
__hash__
또는__eq__
Python 방법으로 구현됨) 및 그 원자성에 의존해서는 안 됩니다.또한 원자 변수 할당에 의존해서는 안 됩니다(이는 사전에 의존하기 때문입니다).사용
Queue
스레드 간에 데이터를 통신하는 기본 방법으로 모듈의 큐 데이터 유형을 지정합니다.그렇지 않으면 스레드화 모듈과 해당 잠금 기본값을 사용합니다.사용할 수 있는 조건 변수의 올바른 사용에 대해 알아보기threading.Condition
더 낮은 수준의 자물쇠를 사용하는 대신.
그리고 저는 이것에 동의합니다: CPython에는 이미 GIL이 있기 때문에 Lock을 사용할 경우의 성능 타격은 무시할 수 있습니다.CPython 구현 세부 정보가 하루 만에 변경되면 복잡한 코드베이스에서 버그를 찾는 데 소요되는 시간이 훨씬 더 많이 소요됩니다.
python의 내장 dict를 사용할 때 set과 get는 (cython의 GIL 때문에) atomic입니다.하지만 .items와 같은 작업이 원자성이 아니기 때문에 나쁜 관행처럼 보입니다.
참고 - 여러 스레드가 동일한 딕트 키에서 작업하는 경우 get-add-set 작업은 스레드 안전하지 않습니다.
dict()는 스레드 세이프가 아닙니다.런타임 오류를 보려면 다음 코드를 실행하기만 하면 됩니다.
import threading
dic = dict()
def producer():
for i in range(1000000):
dic[i] = i
def consumer():
for key, value in dic.items():
print(key, value)
th1 = threading.Thread(target=producer)
th2 = threading.Thread(target=consumer)
th1.start()
th2.start()
th1.join()
th2.join()
RuntimeError: 반복 중에 사전 크기가 변경되었습니다.
언급URL : https://stackoverflow.com/questions/6953351/thread-safety-in-pythons-dictionary
'programing' 카테고리의 다른 글
jQuery 문자열에서 '-' 문자를 제거하는 중 (0) | 2023.08.25 |
---|---|
MySQL의 제한된 수의 테이블에 사용자 액세스 허용 (0) | 2023.08.25 |
jQuery에서 양식 이중 제출 방지 (0) | 2023.08.25 |
gitdiff를 stdout에 쓰도록 하는 방법은? (0) | 2023.08.25 |
재료 각도에서 파지네이터를 사용하는 방법은 무엇입니까? (0) | 2023.08.20 |