동시성 프로그래밍에 대해서 알기 위해서는 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를 적절하게 골라서 활용하여 구현해야 파이썬 프로그래밍을 잘 할 수 있을 것 같습니다.
'python' 카테고리의 다른 글
[Python] contextvars (0) | 2024.01.07 |
---|---|
python asyncio gather vs wait (1) | 2023.05.21 |
[PYTHON] gmail로 메일 보내기 (0) | 2021.08.06 |
[Python] numpy와 랜덤함수 (0) | 2021.04.18 |
[Python] 딕셔너리, Dictionary에서 key를 통해 value를 가져오는 방법 (1) | 2020.08.18 |