program story

Python 사전의 스레드 안전성

inputbox 2020. 9. 10. 07:48
반응형

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

반응형