python에서 cpu core를 여러 개 사용하고자 한다면 threading의 Thread 모듈로는 불가능하다. 그 이유는 python의 GIL(Global Interpreter Lock)정책 때문이다.
여러 개의 쓰레드가 공유자원에 접근하여 값을 변경하는 시도를 할 때 결과가 제대로 반영되지 않는 문제가 발생할 수 있다. 이 문제를 race condition이라고 한다.
python에서는 reference counting을 하여 메모리관리를 한다. 어떤 자원 하나에 접근할 때마다 reference 횟수를 증가시켜 체크한다. 함수에 var라는 변수를 넣을 때도 참조를 하므로 reference count를 증가시키고, 반대로 함수가 끝나면 reference count를 감소시킨다. 이런 식으로 진행하다가 reference count가 0이 되면 메모리에서 이를 제거한다. 우리가 코드를 구현할 때에도 reference count가 0이 되어 메모리 leak이 발생하지 않도록 잘 구현해야 한다. 그러나 race condition이 발생한다면 reference count관리에 문제가 발생할 것이고, 결국 여러가지로 문제가 된다. 이와 같은 상황을 피하기 위해 사용할 수 있는 것이 mutex이고, python은 변수 하나하나마다 mutex를 사용하는 것이 비효율적이라고 판단하여 python interpreter자체에 mutex를 사용하기로 한 것이다. 이것이 python의 GIL이다. Thread를 병렬로 처리하지 않고 interpreter에 대한 mutex를 얻어서 한번에 하나씩만 처리할 수 있도록 되어있다. 당연히 CPU의 core를 하나밖에 사용하지 않아서 처리속도가 느리다는 단점이 발생한다. (single core환경에서는 오히려 효율적이겠지만.)
그래서 CPU core를 모두 사용할 수 있도록 하기 위해 python에서 제공하고 있는 모듈이 multiprocessing이다. 이것도 모르고 여태까지 thread만 주구장창 써왔다… 물론 thread를 사용함으로써 프로그램의 효율성이 높아진 것은 사실이지만 한계가 있었다는 것이다.
Multiprocessing module의 사용법은 간단하다. Thread와 비슷하다.
from multiprocessing import Process
class gStreamingCamera:
def run(self):
self.p = Process(target=self.startStreaming, args=(self.gearOptions,))
self.p.start()
def stop(self):
self.stream.stop()
self.p.join()
'개발Study > python' 카테고리의 다른 글
pip 패키지 설치 시간 단축시키기 (0) | 2023.09.07 |
---|---|
convert hex string to bytes (0) | 2023.08.08 |
python lambda (0) | 2021.03.21 |
python 소멸자 (0) | 2021.03.11 |
댓글