Python/파이썬 심화

Futures 모듈 (2)

monstro 2025. 10. 25. 20:48
728x90
반응형

- 개요

이전에 여러 작업을 수행하기 위해 사용한 map 함수는 입력한 순서대로 작업을 반환한다

그러나 상황에 따라서 유동적으로 작업을 수행해야 하는 경우가 존재한다

이를 위해 Futures 모듈에서 2개의 함수를 사용할 수 있다

  • map 함수 : 입력한 순서대로 작업을 반환
    • 작업의 처리 순서 보장이 필요한 경우에 사용
  • wait 함수 : 완료된 작업의 집합과 완료되지 않은 작업의 집합을 반환
    • 작업의 상태 관리, 제어 필요한 경우에 사용
  • as_completed 함수 : 완료되는 순서대로 작업을 반환
    • 빠른 결과부터 처리하는 경우에 사용

 

- 공통 요소

from concurrent.futures import ThreadPoolExecutor, wait, as_completed
import time

JOBS = [100000, 1000000, 10000000, 100000000]

def sum_generator(n):
    return sum(n for n in range(1, n + 1))
    
...

 

이전의 예제와 동일하게 공통 요소를 구성하였다

sum_generator 함수를 호출하여 JOBS를 순회하며 1부터 해당하는 인덱스의 숫자까지 더하는 작업을 수행한다

 

1) wait 함수 사용예제

...

def UseWait():
    start_tm = time.time()
    future_list = []

    with ThreadPoolExecutor() as excutor:
        for job in JOBS:
            # future(처리할 일) 반환
            future = excutor.submit(sum_generator, job)
            # 처리할 일 스케줄링
            future_list.append(future)
            # 스케줄링된 일 확인
            print(f"Schedule for {job} : {future}")

        # timeout동안 처리하지 못한 일은 중단
        result = wait(future_list, timeout=3)

        # 성공
        print(f"Completed Job : {str(result.done)}")
        # 실패
        print(f"Cancelled Job : {str(result.not_done)}")

    # 종료 시간
    end_tm = time.time() - start_tm
    # 최종 작업 수행 시간 출력
    print(f"Result = {[future.result() for future in result.done]} / Time : {end_tm:.2f}")
    
...
    
 if __name__ == '__main__':
 	UseWait()

 

wait 함수를 사용하여 작업을 처리하는 UseWait 함수를 위와 같이 구성하였다

wait 함수를 호출하여 처리된 작업처리하지 못한 작업의 집합을 반환한다

로직은 다음과 같다

  • submit 함수를 호출하여 처리할 작업을 의미하는 future 인스턴스를 반환 + 저장
  • wait함수를 호출하고 timeout 인자를 설정하여 작업을 처리하기 위한 기한을 설정
  • donenot_done을 사용하여 처리한 작업기한을 넘겨 처리하지 못한 작업 출력

 

실행 결과

 

실행한 결과는 위와 같다

처리 기한을 넘긴 하나의 작업을 제외한, 나머지 3개의 작업을 처리한 것을 확인할 수 있다

 

2) as_completed 함수 사용예제

...

def UseAsCompleted():
    start_tm = time.time()
    future_list = []

    with ThreadPoolExecutor() as excutor:
        for job in JOBS:
            # future(처리할 일) 반환
            future = excutor.submit(sum_generator, job)
            # 처리할 일 스케줄링
            future_list.append(future)
            # 스케줄링된 일 확인
            print(f"Schedule for {job} : {future}")

        # as_completed 결과 출력
        for future in as_completed(future_list):
            result = future.result()
            done = future.done()
            cancelled = future.cancelled()

            # 최종 결과 확인
            print(f"Future Result : {result} / Doned? : {done} / Cancelled? : {cancelled}")

    # 종료 시간
    end_tm = time.time() - start_tm
    # 최종 작업 수행 시간 출력
    print(f"Total Time : {end_tm:.2f}")
    
...

if __name__ == '__main__':
    UseAsCompleted()

 

as_completed 함수를 사용하여 작업을 처리하는 UseAsCompleted 함수를 위와 같이 구성하였다

as_completed 함수를 호출하여 먼저 처리된 작업부터 반환한다

로직은 다음과 같다

  • 동일하게 submit 함수를 호출하여 처리할 작업을 의미하는 future 인스턴스를 반환 + 저장
  • as_completed 함수를 호출하고 저장된 future 인스턴스들을 넘겨 작업 수행
  • donecancelled를 사용하여 처리한 작업처리하지 못한 작업을 출력

 

실행 결과

 

실행한 결과는 위와 같다

우선 처리된 작업의 결과부터 출력된 것을 확인할 수 있다

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

AsyncIO 라이브러리  (0) 2025.11.01
Futures 모듈 (1)  (0) 2025.10.19
Futures 모듈이란?  (0) 2025.10.19
코루틴 (2)  (0) 2025.10.12
코루틴 (1)  (0) 2025.10.12