[python] 파이썬 동시성 프로그래밍
동시성 프로그래밍에 대해서 알기 위해서는 Bound, Thread, Process, Sync, Async라는 개념들을 알고 넘어갈 필요가 있습니다.
Bound부터 하나씩 알아보도록 하겠습니다.
Bound
동시성 프로그래밍에 대해서 공부하려면 먼저 Bound라는 개념을 알고 갈 필요가 있는데, Bound는 묶인단 뜻으로 작업을 하면서 묶이게 되는 시간을 뜻 합니다.
Bound는 CPU Bound와 I/O Bound 2가지로 나뉩니다.
CPU Bound
CPU를 활용하는 작업에 따라 기다리게 되는 구간을 뜻 합니다.
ex) 수학 연산, 딥러닝 연산, 이미지 처리 등
I/O Bound
I/O 작업에 대해서 기다리는 구간을 뜻 합니다.
ex) 파일 입출력, 네트워크 요청 등
Thread vs Process
Thread
Thread는 프로세스 내에서 실행되는 여러 흐름의 단위를 뜻 합니다.
Process
컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램, 운영체제로부터 시스템 자원을 할당받는 작업의 단위를 뜻 합니다.
Sync vs Async
Sync
Sync는 동기를 뜻하고, 동기 방식으로 구현된 코드는 순차적으로 실행이 됩니다.
Async
Asyncs는 비동기를 뜻하고, 비동기 방식으로 구현된 코드는 각 작업이 차례가 왔을 때 마다 실행이 됩니다.
파이썬의 동시성 프로그래밍
GIL(Global Interpreter Lock)
파이썬의 GIL은 한번에 하나의 thead만 동작할 수 있도록 Lock이 존재합니다.
GIL이 동작함에 따라, 하나의 Process 내에서는 여러 개의 thread가 동시에 실행이 불가능하게 됩니다.
GIL은 파이썬이 느린 이유 중에 하나로 들 수 있습니다.
Multi Threading
GIL의 영향으로 실제로는 한번에 하나의 thread만 실행됩니다.
I/O Bound 작업에 대해서는 기다리는 시간을 활용해 병렬처리가 가능하지만, CPU Bound 작업에 대해서는 한 번에 하나만 실행이 되어 multi thread를 활용해도 병렬처리가 전혀 불가능 합니다.
Multi Processing
Process가 여러 개 실행되는 구조로, 각 Process가 별도의 GIL을 가지기 때문에 CPU Bound 작업에 대해서도 동시에 작업을 할 수 있습니다.
Asyncio
비동기를 지원하며, I/O Bound 작업들이 동시에 실행되게 됩니다.
비동기의 특성에 따라 CPU Bound 작업은 동시에 실행되지 않습니다.
CPU 코어는 1개만 사용하게 됩니다.
오늘은 파이썬의 동시성 프로그래밍에 대해서 정리해보았습니다.
GIL이 있어서 한 번에 하나의 thread만 실행될 수 있다는 점을 잘 유의해서 multi threading, multi processing, asyncio를 적절하게 골라서 활용하여 구현해야 파이썬 프로그래밍을 잘 할 수 있을 것 같습니다.