파비의 매일매일 공부기록

파이썬 동시성 프로그래밍 - #5 스레드 간의 통신 본문

Study/Python

파이썬 동시성 프로그래밍 - #5 스레드 간의 통신

fabichoi 2021. 8. 12. 23:30

이번장은 스레드 간의 통신에 대한 내용이다.

통신은 동시성 시스템에서 중요한 부분으로 적절한 통신 메커니즘 구현 없이는 동시성 및 병렬화의 어떤 성능 효과도 얻을 수 없다.

스레드 및 프로세스 들 간에 통신할 때 가장 이슈가 많이 일어나는데, 그전에 모든 상황과 옵션을 이해해야 한다.

 

이번장에서는 자체 통신 메커니즘을 구현하는 방법을 배우고 언제 어디서 사용하는지를 알아본다.

 

기본적인 자료구조 : 파이썬에서 기존 자료구조는 기본적으로 다양한 스레드 세이프 형태를 띠고 있음.

 

다음은 각 자료구조 별 스레드 세이프 방식으로 구현하는 예를 소개한다.

세트 : 스레드 세이프 방식으로 set 클래스를  이용하는 가장 좋은 방법은 set 클래스를 확장하는 것. 기존의 파이선 set 클래스로부터 상속받는 LockedSet 클래스 객체 정의. add/remove/contains 함수 정의

데코레이터 : 스레드 세이프 통신을 위해서라면 추가적인 기술적인 방법이 필요. (데코레이터 활용 등) 

클래스 데코레이터 : 메서드 1개만 보호하는 걸 넘어 클래스 내의 모든 함수를 보호해 스레드 세이프 방식으로 호출하도록 구성. 

리스트 : 기본적은 리스트는 스레드에는 안전하나 리스트에 접근할 때만 안전. 리스트 구조에서 나타난 데이터는 보호되지 않기에 데이터를 안전하게 변경하려면 적절한 락 메커니즘 구현 필요하며 경합 조건 발생에도 유의해야 함. 세트에서의 예와 같은 방식으로 클래스를 확장해야 함.

큐 : 내장 큐 모듈에서 일반적인 Queue, LifoQueue, PriorityQueue라는 세 가지 형태의 큐 제공. 기본적으로 스레드에 안전하므로 복잡한 락 메커니즘 구현할 필요 없음.

 - FIFO 큐 : 기본적인 큐. 요청을 공평하게 처리 가능, 대기수에 따라 처리시간 가늠 가능

 - LIFO 큐 : 일반적인 큐와는 정반대로 동작. DFS, DLS 등 인공지능 기반 알고리즘에 부분적으로 사용. 

 - 우선순위 큐 : 큐 메커니즘에 우선순위가 추가된 형태. 가중치를 두어 큐에 집어넣어서 구현. 튜플을 사용해 (순위 값, 객체) 형태로 사용

queue 객체 : 꽉 찬 큐/빈 큐에 대한 퍼블릭 메서드 존재. join 메서드 존재.

deque 객체 : collections 모듈이 있어서 큐 양쪽에서 삽입하고 빼내는 부분이 존재.

그 외에도 원소 추가/꺼내기/삽입/회전에 대한 소스 소개.

 

자체적인 스레드 세이프 통신 구조 정의하기 : 기본적인 통신 프리미티브 대신 스레드 간의 통신을 위해 자체 구성 객체를 구현하는 예를 소개. 여기서는 웹 크롤러에 대한 내용.

 

각 기능 및 요소에 대한 짧은 소스들과 그에 대한 설명들이 매우 잘 소개되어있다.

하나씩 소스를 따라 작성하다 보면 책에 있는 설명과 같이 이해하기가 매우 용이했다.

반응형
Comments