작성
·
262
0
아래의 코딩은 수업시간 예제입니다.
제 질문은 같은 코드를 다른 파이썬 파일에서 재작성후 실행했을 때 완료 순서가 달리 나올수 있는가 입니다.
예제파일은 [10000, 100000, 1000000, 10000000] 순서로 완료 되었고,
제가 새로 작성한 곳에서는
[100000,10000,1000000, 10000000] 이 순서로 완료가 되었습니다.
import os
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, wait, as_completed
WORK_LIST = [10000, 100000, 1000000, 10000000]
# 동시성 합계 계산 메인 함수
# 누적 합계 함수(제레네이터)
def sum_generator(n):
return sum(n for n in range(1, n+1))
# wait
# as_completed
def main():
# Worker Count
worker = min(10, len(WORK_LIST))
# 시작 시간
start_tm = time.time()
# Futures
futures_list = []
# 결과 건수
# ProcessPoolExecutor
with ThreadPoolExecutor() as excutor:
for work in WORK_LIST:
# future 반환
future = excutor.submit(sum_generator, work)
# 스케쥴링
futures_list.append(future)
# 스케쥴링 확인
print('Scheduled for {} : {}'.format(work, future))
# print()
# wait 결과 출력
# result = wait(futures_list, timeout=7)
# # 성공
# print('Completed Tasks : ' + str(result.done))
# # 실패
# print('Pending ones after waiting for 7seconds : ' + str(result.not_done))
# # 결과 값 출력
# print([future.result() for future in result.done])
# as_completed 결과 출력
for future in as_completed(futures_list):
result = future.result()
done = future.done()
cancelled = future.cancelled
# future 결과 확인
print('Future Result : {}, Done : {}'.format(result, done))
print('Future Cancelled : {}'.format(cancelled))
# 종료 시간
end_tm = time.time() - start_tm
# 출력 포멧
msg = '\n Time : {:.2f}s'
# 최종 결과 출력
print(msg.format(end_tm))
# 실행
if __name__ == '__main__':
main()
답변 1
1
네 맞습니다.
실행 순서가 먼저 끝나는 대로 리턴됩니다.
논리적으로 보면 숫자가 작은 순서대로 나오겠지만, 1000, 10000, 100000 까지는 금방 처리될 것으로 생각되네요.
컨텍스트 체인지 하는 cost(비용) 도 고려하기 때문에 순서는 언제든지 달라질 수 있어요!