python

[python] 파이썬 동시성 프로그래밍

seokhyun2 2024. 3. 31. 18:10

동시성 프로그래밍에 대해서 알기 위해서는 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를 적절하게 골라서 활용하여 구현해야 파이썬 프로그래밍을 잘 할 수 있을 것 같습니다.