반응형

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 자동 스케줄링/예외처리
언제 쓰면 좋나? 빠르게 병렬처리를 설계하고 싶을 때 특히 유용

🔗 참고자료

728x90
반응형

+ Recent posts