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 인자를 설정하여 작업을 처리하기 위한 기한을 설정
- done과 not_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 인스턴스들을 넘겨 작업 수행
- done과 cancelled를 사용하여 처리한 작업과 처리하지 못한 작업을 출력

실행한 결과는 위와 같다
우선 처리된 작업의 결과부터 출력된 것을 확인할 수 있다
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 |