파이썬에서 쓰레드는 왜 쓰는걸까? (개념, 예제)

2024. 8. 4. 22:20Language/Python

반응형


1.  서론

회사에서 파이썬으로 RPA 프로그램을 개발하던 중 쓰레드라는 놈에 대해 알게되었다.

 

프로그램이 데이터를 api 서버로 보내서 처리하는 동안 사용자에게  프로그레스바를 보여주는 과정에서 쓰레드 개념을 적용하게 되었는데, 작동 방식이 제대로 이해가 되지 않아서 이번 기회에 정리를 하고 넘어가려고 한다.

(쓰레드를 join하고 종료 처리했는데 서 자꾸 main loop 오류에 발목을 잡혔다.)

 

렛츠꼬우~

2.  쓰레드의 개념

1) 쓰레드란 무엇인가

  • 쓰레드는 프로세스 내에서 독립적으로 실행되는 가장 작은 실행 단위이다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있으며, 이들 쓰레드는 프로세스의 자원을 공유한다. 파이썬에서는 threading 모듈을 통해 사용한다.
  • 구성 요소 : 각 쓰레드는 고유의 레지스터와 스택을 가지고 있으며, 이 외의 메모리 영역은 다른 쓰레드와 공유한다.

2) 멀티쓰레딩의 필요성

  • 동시성(Concurrency) : 멀티쓰레딩은 프로그램이 동시에 여러 작업을 수행할 수 있도록 한다. 특히 I/O (Input/Output) 작업이 많은 프로그램에서 유용하다.
  • 응답성 형상 : GUI 어플리케이션에서 백그라운드 작업을 별도의 쓰레드로 처리하여 사용자 인터페이스의 응답성을 유지할 수 있다.

3) 파이썬에서의 쓰레드

  • Global Interpreter Lock (GIL): 파이썬은 GIL이라는 메커니즘 때문에 멀티쓰레딩에서 한 번에 하나의 쓰레드만 실행할 수 있다. 이는 파이썬이 메모리 관리를 쉽게 하기 위한 조치이지만, CPU 바운드 작업에서 멀티쓰레딩의 성능을 제한한다.

3.  쓰레드의 활용

 

1) 기본 예제

# 쓰레드 모듈 호출
import threading

def print_numbers():
    for i in range(10):
        print(i)

# 쓰레드 생성
# 실행할 함수를 target 인자로 전달한다.
thread = threading.Thread(target=print_numbers)

# 쓰레드 시작
thread.start()

# 메인 쓰레드가 다른 작업을 계속할 수 있음
print("Main thread continues to run...")

# 쓰레드 완료 대기
thread.join()
print("Thread has finished execution.")

 

 

2) threading 모듈의 추가 기능

  • Lock(잠금) : 쓰레드 간에 공유 자원에 대한 접근을 제어하는 가장 기본적인 동기화 도구. 하나의 쓰레드만 `Lock`을 획득할 수 있으며, 다른 쓰레드는 `Lock`이 해제될 때까지 대기한다.
  • RLcok(재귀적 잠금) : 동일한 쓰레드가 여러 번 잠금을 획득할 수 있게 한다.
  • Semaphore (세마포어) : 일정 개수의 쓰레드가 공유 자원에 접근할 수 있도록 한다. 네트워크 연결의 동시 최대 개수를 제한하는 데 유용하다.
  • Event(이벤트) : 쓰레드 간의 신호를 보내기 위해 사용. 한 쓰레드가 이벤트를 설정하면 대기 중인 다른 쓰레드들이 계속 실행된다.
  • Condition(조건 변수) : 복잡한 동기화 문제를 해결하는 데 사용. 특정 조건이 만족될 때까지 쓰레드를 대기키시고, 조건이 만족되면 다른 쓰레드들이 이를 알도록 한다.

 

4.  쓰레드 사용 시 주의사항

1) GIL(Global Interpreter Lock)

GIL은 한 번에 하나의 쓰레드만 실행되도록 하며, 일정 시간(또는 I/O 작업 시) 이후 다른 쓰레드로 전환된다.

이는 멀티쓰레딩을 사용하는 프로그램에서도 실제로는 한 쓰레드만 실행되는 상태를 초래하여 병목현상이 발생할 수 있다.

 

2) 데드락(Deadlock)

데드락은 두 개 이상의 쓰레드가 서로가 가진 자원을 기다리며 무한 대기 상태에 빠지는 것을 말한다.

자원 획득 순서를 지정하거나 타임아웃을 설정하여 데드락을 피할 수 있다.

데드락의 원인
- 순환 대기: 두 쓰레드가 서로가 가진 자원을 필요로 할 때 발생
- 비선점 조건: 자원이 강제로 회수되지 않고 자원을 가진 쓰레드가 자원을 스스로 해제할 때까지 대기
- 점유 대기: 자원을 가진 쓰레드가 다른 자원을 기다릴 때 발생
- 상호 배제: 자원이 한 번에 한 쓰레드만 사용할 수 있을 때 발생

 

5.  마무리

파이썬에서 쓰레드는 프로그램의 효율성과 성능을 개선하기 위해 사용한다.

주로 I/O 바운드 작업의 최적화, 비동기 작업 처리, 다중 사용자 지원 등에 사용하는 도구로 쓰레드를 활용하여 프로그램의 성능을 극대화할 수 있다.

 

 

 

마침 인프런에 예전에 사뒀던 파이썬 중급 프로그래밍 강의에 병행성 관련된 부분이 있어서 예전에 들었던 강의를 다시 한번 복습해봤다. (병행성 챕터까지는 가지도 않고 방치해두고 있던 유물 강의였음)

 

클래스 다루는 부분부터 왜 이게 중요한지 체감을 못한 채로 들으니까 흥미가 떨어져서 그대로 방치하게 되었던 강의였는데, 지금 다시 들으니까 명강의가 따로 없는 것 아닌가.

 

이번엔 이 강의를 완주할 수 있을 것 같다.

 

 

 

반응형
top
bottom