Sangmun

python 동시성에 대한 정리 본문

개발

python 동시성에 대한 정리

상상2 2023. 3. 7. 23:42

동시성이라는 의미는 동시에 여러 가지 일이 발생하는 것을 의미하며 프로그래밍에서는 여러 작업을 동시에 처리하는 것을 의미한다.

python에서는 해당개념을 언급할때 thread, task, multiprocessing이 언급되는데 진정한 의미에서 동시에 작업을 처리하는 것은 multiprocessing만 해당된다. 따라서 본 글에서는 위의 3가지 개념에 대한 차이점과 용도를 정리하고자 한다.

 

먼저 Threading과 Asyncio는 하나의 CPU 코어에서만 작업이 이루어지만 동시에 여러 작업을 왔다 갔다 하면서 처리하기 때문에 여러 작업을 동시에 수행하는 것처럼 보인다. 하지만 언급했듯이 실제로 작업을 수행하는 CPU 코어는 하나이다.

이러한 것을 multitasking이라고 하는데 Threading과 Asyncio는 작업을 차지하는 방식에서 차이가 있으며, Threading은 pre-emptive multitasking이고, Asyncio는 cooperative multitasking이다.

 

Pre-emptive multitasking은 운영체가 각각의 thread에 대해서 인지하고 있고 언제든 다른 작업을 실행하기 위해 현재 작업 중인 thread를 잠시 중지할 수 있다.

반면 cooperative multitasking은 하나의 작업이 준비가 되었을때 다른 작업과 협력하여 작업이 스위칭된다.

 

병렬화란 무엇인가

thread, Asyncio, multiprocessing 중에서 진정으로 병렬작업을 수행하는 것은 multiprocessing이며 multiprocessing으로 생성된 작업은 각각의 cpu 코어에서 작업을 수행하며 완전히 다른 프로그램으로 생각해도 될 정도이다. 또한 각각의 프로세스가 메모리등의 자원을 따로 가지고 있다.

Threading, asyncio, multiprocessing 차이점

 

CPU-bound와 I/O-bound

 

I/O-bound는 우리의 프로그램의 속도를 늦게하는 프로그램으로 외부 자원의 input/output을 받아 수행해야 하는 작업을 말한다. 외부 자원의 작업은 보통 속도가 느림으로 우리의 프로그램은 대부분의 시간을 외부 작업을 기다리느라 보내게 된다.

이러한 I/O-bound에는 network 연결, file system 작업등이 있다.

CPU-bound는 네트워크 연결이나 file에 접근하지 않고 계산에 집중하는 작업을 의미하며 프로그램의 속도를 제한하는 요소로는 오직 CPU의 성능밖에 없다.

 

I/O bound, CPU bound

 

따라서 I/O-bound 의 속도문제를 해결하기 위해서는 외부작업을 기다리는 작업을 순차적으로 실행하지 않고 기다리는 작업을 overlapping 하면서 해결을 해야 한다. 따라서 Thread와 asyncio가 해당 작업에 적합하다고 할 수 있다.

반면에 CPU-bound 작업에서는 thread와 asyncio를 사용한다고 해도 overlapping할 수 있는 작업이 없으며 오히려 여러 개가 생성된 thread나 asyncio의 multitasking에 사용되는 오버헤드 때문에 그냥 코드를 작성한 것보다 시간이 더 소요될 수 있다.

따라서 CPU-bound 작업에는 아예 작업을 나눠서 동시에 실행할 수 있는 multiprocessing이 더 적합하다고 할 수 있다.

threading I/O bound, Asyncio I/O bound, CPU bound multiprocessing

 

출처 : https://realpython.com/python-concurrency/#how-to-speed-up-an-io-bound-program

 

Speed Up Your Python Program With Concurrency – Real Python

Learn what concurrency means in Python and why you might want to use it. You'll see a simple, non-concurrent approach and then look into why you'd want threading, asyncio, or multiprocessing.

realpython.com

 

Comments