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의 내장 구조는 단일 작업에 대해 스레드로부터 안전하지만 문이 실제로 여러 작업이되는 위치를 확인하기 어려울 수 있습니다.
코드는 안전해야합니다. 여기에 잠금 장치를 사용하면 오버 헤드가 거의 추가되지 않으며 안심할 수 있습니다.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm 에 자세한 내용이 있습니다.
예, 내장 유형은 본질적으로 스레드로부터 안전합니다. http://docs.python.org/glossary.html#term-global-interpreter-lock
이는 동시 액세스에 대해 암시 적으로 안전한 객체 모델 ( dict와 같은 중요한 내장 유형 포함) 을 만들어 CPython 구현을 단순화합니다 .
Google의 스타일 가이드가 dict 원자성에 의존하지 말라고 조언한다는 점은 주목할 가치가 있습니다 .
기본 제공 유형의 원자성에 의존하지 마십시오.
반면 파이썬에 내장 된 사전과 같은 데이터 유형들은 원자 수없는 코너 케이스가, 원자 작업을 가지고있는 것 같습니다 (예를 들어, 경우
__hash__
또는__eq__
파이썬 방법으로 구현)과 자성이에 의존해서는 안됩니다. 원자 변수 할당에 의존해서는 안됩니다 (이는 사전에 따라 달라지기 때문입니다).
Queue
스레드간에 데이터를 통신하는 기본 방법으로 모듈의 큐 데이터 유형을 사용하십시오 . 그렇지 않으면 threading 모듈과 잠금 프리미티브를 사용하십시오.threading.Condition
하위 수준 잠금을 사용 하는 대신 사용할 수 있도록 조건 변수의 적절한 사용에 대해 알아 봅니다 .
그리고 저는 이것에 동의합니다. CPython에는 이미 GIL이 있으므로 Lock 사용으로 인한 성능 저하는 무시할 수있을 것입니다. CPython 구현 세부 사항이 언젠가 변경되면 복잡한 코드베이스에서 버그를 찾는 데 소요되는 시간이 훨씬 더 비쌉니다.
참고 URL : https://stackoverflow.com/questions/6953351/thread-safety-in-pythons-dictionary
'program story' 카테고리의 다른 글
ValueError : 수학 도메인 오류 (0) | 2020.09.10 |
---|---|
이 부동 소수점 최적화가 허용됩니까? (0) | 2020.09.10 |
unique_ptr이있는 클래스의 복사 생성자 (0) | 2020.09.10 |
shared_ptr 인 이유 (0) | 2020.09.10 |
jsfiddle 내부에서 콘솔을 얻는 방법 (0) | 2020.09.09 |