파이썬/기초 프로그래밍

Python 동시성 프로그래밍: concurrent.futures 실습

Data Jun 2025. 9. 9. 15:36

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 바운드 작업이나 병렬로 나눌 수 있는 연산에 활용하면 압도적인 성능 향상을 얻을 수 있습니다.