concurrent.futures란?
Python 3.2 이상에서 기본 제공되는 고수준(High-level) 병렬 처리 라이브러리
concurrent.futures는 멀티스레딩(Thread) 또는 멀티프로세싱(Process)을 훨씬 간단하게 구현할 수 있게 도와주는 표준 라이브러리입니다.
Executor, submit, Future 같은 개념을 기반으로 병렬 작업을 추상화하고 자동으로 스케줄링해줍니다.
대표 클래스
- ThreadPoolExecutor: 스레드 기반 병렬 처리
- ProcessPoolExecutor: 프로세스 기반 병렬 처리 (CPU 병렬화에 적합)
주요 개념 설명
Executor | 스레드 또는 프로세스를 관리하는 실행기 |
Future | 아직 완료되지 않은 작업의 결과를 나타내는 객체 |
*submit(fn, args) | 작업을 실행 큐에 비동기로 등록 |
result() | 작업이 완료될 때까지 기다린 후 결과 반환 |
기본 사용 예제
from concurrent.futures import ThreadPoolExecutor
def task(x):
return x * x
with ThreadPoolExecutor(max_workers=3) as executor:
future = executor.submit(task, 5)
print(future.result()) # 출력: 25
- submit()은 작업을 비동기로 예약
- result()는 Future 객체의 실행 결과를 반환 (필요하면 대기)
threading 모듈과의 차이점
concurrent.futures는 threading 모듈보다 더 간결하고, 안전하며, 확장성 있는 방식으로 병렬 처리를 제공합니다.
항목 | threading 모듈 | concurrent.futures 모듈 |
레벨 | 저수준 (Low-level) | 고수준 (High-level) |
제어 | 직접 Thread 객체 생성, 시작, 관리 | Executor가 스레드를 대신 관리 |
코드 복잡도 | 복잡함 (start/join/lock 등 직접 관리) | 매우 간결 (submit만 하면 됨) |
오류 처리 | try/except 수작업 | Future에서 예외 자동 관리 |
스케줄링 | 수동 (Queue 사용 필요) | 자동 (Executor가 내부 큐 관리) |
멀티프로세싱 지원 | 불가 (Thread만) | 가능 (ProcessPoolExecutor로 프로세스 병렬화) |
코드 비교
1. threading 모듈 사용
import threading
def worker(x):
print(x * x)
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
t.start()
threads.append(t)
for t in threads:
t.join()
- 직접 Thread 객체를 생성하고 start(), join()을 관리해야 합니다.
- 예외 처리는 try/except를 수동으로 구현해야 함
2. concurrent.futures 사용
from concurrent.futures import ThreadPoolExecutor
def worker(x):
return x * x
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(worker, i) for i in range(5)]
results = [f.result() for f in futures]
print(results) # 출력: [0, 1, 4, 9, 16]
- submit()만 호출하면 Executor가 자동으로 작업을 관리
- Future.result()를 통해 결과 또는 예외를 얻을 수 있음
실무에서 언제 어떤 걸 써야 할까?
상황 | 추천 모듈 |
웹 크롤링, 파일 다운로드, DB insert 등 I/O 중심 | ThreadPoolExecutor |
영상 인코딩, 이미지 처리 등 CPU 집중 작업 | ProcessPoolExecutor |
세밀한 스레드 동기화 제어 필요 (Lock 등) | threading (낮은 수준의 제어) |
마무리 요약
concurrent.futures란? | Executor 기반 병렬 처리 고수준 API |
threading과 차이점은? | 수동 관리 vs 자동 스케줄링/예외처리 |
언제 쓰면 좋나? | 빠르게 병렬처리를 설계하고 싶을 때 특히 유용 |
🔗 참고자료
'개발라이프 > 파이썬' 카테고리의 다른 글
Anaconda 설치 후 자동 활성화 비활성화 방법 💻 (0) | 2025.01.22 |
---|---|
Python 리스트 컴프리헨션(List Comprehension) 완벽 가이드 (1) | 2024.11.28 |
[파이썬] 딕셔너리 변수를 판다스 데이터프레임으로 선언하기 (0) | 2024.11.27 |