나는 최근에 간단한 생산자/소비자 패턴을 사용하는 프로그램을 작성했습니다. 처음에는 스레딩의 부적절한 사용과 관련된 버그가있었습니다. 그러나 그것은 잠김없는 방식으로 생산자/소비자 패턴을 구현할 수 있는지 생각하게했습니다.파이썬 생산자 - 소비자 잠금없는 접근 방식이 스레드로부터 안전한가요?
- 한 프로듀서 스레드 : 내 경우에는
요구 사항은 간단했다.
- 소비자 스레드 한 개.
- 대기열에는 하나의 항목에 대한 장소가 있습니다.
- 생산자는 현재 항목이 소비되기 전에 다음 항목을 생성 할 수 있습니다. 따라서 현재 아이템은 없어지지 만 괜찮습니다.
- 소비자는 다음 항목이 생성되기 전에 현재 항목을 소비 할 수 있습니다. 따라서 현재 항목은 두 번 (또는 그 이상) 소비되지만, 괜찮습니다.
그래서 내가 쓴 :
QUEUE_ITEM = None
# this is executed in one threading.Thread object
def producer():
global QUEUE_ITEM
while True:
i = produce_item()
QUEUE_ITEM = i
# this is executed in another threading.Thread object
def consumer():
global QUEUE_ITEM
while True:
i = QUEUE_ITEM
consume_item(i)
내 질문은 :이 코드 스레드 - 안전합니까?
즉석 코멘트 :이 코드는 실제로는 잠금이 없습니다. CPython을 사용하며 GIL이 있습니다.
코드를 조금 테스트했는데 제대로 작동하는 것 같습니다. 그것은 GIL 때문에 원자 적 인 일부로드 및 저장 연산으로 변환됩니다. 그러나 x가 __del__
메소드를 구현할 때 del x
조작이 원자가 아님을 또한 알고 있습니다. 따라서 내 항목에 __del__
메쏘드가 있고 약간의 불규칙한 스케쥴링이 발생하면 일이 깨질 수 있습니다. 안 그래요?
또 다른 질문은 위의 코드가 제대로 작동하도록하려면 어떤 종류의 제한 사항 (예 : 생산 된 항목 유형)을 사용해야합니까?
내 질문은 이론적으로 CPython 및 GIL의 단점을 악용하여 잠금이 필요 없음 (즉, 코드에서 threading.Lock을 명시 적으로 잠그지 않음) 솔루션을 제시합니다.
왜 __del__ 메서드를 작성 하시겠습니까? –