Python에서 **동시성(Concurrency)**을 다룰 때, concurrent.futures 모듈은 가장 간단하면서도 강력한 도구입니다.
특히 스레드 풀(ThreadPoolExecutor) 과 **프로세스 풀(ProcessPoolExecutor)**을 동일한 API로 다룰 수 있어서, 코드 작성이 매우 직관적입니다. 이번 글에서는 submit, wait, as_completed 패턴을 활용하여 비동기 실행을 실습한 코드를 살펴보겠습니다.
1. 실습 코드 소개
아래 코드는 WORK_LIST에 있는 여러 개의 숫자에 대해 1부터 n까지의 합을 동시에 계산하는 예제입니다.
from concurrent.futures import ThreadPoolExecutor, wait, as_completed
import time
WORK_LIST = [10000, 100000, 1000000, 10000000]
# 누적 합계 계산 함수
def sum_generator(n):
return sum(n for n in range(1, n+1))
def main():
start_tm = time.time()
futures_list = []
# ThreadPoolExecutor 사용
with ThreadPoolExecutor() as executor:
for work in WORK_LIST:
future = executor.submit(sum_generator, work)
futures_list.append(future)
print(f'Scheduled for {work} : {future}')
# (1) wait 예시 (주석 처리된 부분)
# result = wait(futures_list, timeout=7)
# (2) as_completed 예시
for future in as_completed(futures_list):
result = future.result()
print(f'Future Result : {result}, Done : {future.done()}')
print(f'Future Cancelled : {future.cancelled}')
end_tm = time.time() - start_tm
print(f"\nTime : {end_tm:.2f}s")
if __name__ == '__main__':
main()
주요 포인트
1) executor.submit()
- 작업을 풀에 등록하고 Future 객체를 반환합니다.
- Future는 결과를 담을 그릇 같은 개념이며, 작업이 끝나면 결과나 예외가 저장됩니다.
2) wait()
- 등록된 Future들이 끝날 때까지 대기하는 방식.
- timeout을 지정하면 해당 시간 동안만 기다리고, 완료되지 않은 작업은 not_done으로 남습니다.
- 전체적으로 한 번에 동기화가 필요할 때 유용합니다.
3) as_completed()
- Future들이 완료되는 즉시 하나씩 결과를 가져올 수 있게 해줍니다.
- 모든 작업을 기다리지 않고, 끝나는 대로 바로 처리할 수 있어 실시간 성격의 프로그램에 적합합니다.
2. 실행 결과 예시
실행하면 아래와 비슷한 출력이 나옵니다:
Scheduled for 10000 : <Future at 0x... state=running>
Scheduled for 100000 : <Future at 0x... state=running>
Scheduled for 1000000 : <Future at 0x... state=running>
Scheduled for 10000000 : <Future at 0x... state=running>
Future Result : 50005000, Done : True
Future Cancelled : False
Future Result : 5000050000, Done : True
Future Cancelled : False
Future Result : 500000500000, Done : True
Future Cancelled : False
Future Result : 50000005000000, Done : True
Future Cancelled : False
Time : 0.47s
정리하면
- concurrent.futures는 스레드/프로세스를 통합된 방식으로 다룰 수 있게 해주는 고수준 API입니다.
- submit → 작업 등록, wait → 일괄 대기, as_completed → 완료 즉시 처리.
- 특히 I/O 바운드 작업이나 병렬로 나눌 수 있는 연산에 활용하면 압도적인 성능 향상을 얻을 수 있습니다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| Python에서 locals()로 함수의 로컬 영역 확인하기 (0) | 2025.09.13 |
|---|---|
| Python 함수 내 전역 변수(Global Variable) 사용하기 (0) | 2025.09.13 |
| 파이썬 concurrent.futures에서 Future 객체의 Wait 다루기 (0) | 2025.09.09 |
| 파이썬 concurrent.futures를 이용한 병행 처리 간단 이해하기 (0) | 2025.09.09 |
| 파이썬 코루틴과 제너레이터 상태 & yield from 이해하기 (1) | 2025.09.09 |