"프로그래밍 언어의 개념과 흐름에 대한 고찰 - 파이썬답게 코딩하기" 학습중...
비동기 기법에 대해 알아보는데 처음 보는 생소한 개념이라 이해하는데 어려움이 좀 있네요.
동기 user와 커널간 request와 response를 갖는 단순한 구조
동기 논블록 request와 response간 진행 상황을 수시로 체크하는 구조
비동기 블록 소켓방식에서 많이 사용. 요청한 data가 완성되면 user에게 response 하는 방식. 그래도 data request는 보내야 함.
비동기 논블록 효율적이나 구현이 어려움. 중간 사항 체크없이, 추가적인 데이터 요청이 없어도 데이터가 완료되면 user에게 전달.
동기 비동기의 차이는 사용자가 작업을 요청하고 결과를 받을 때까지 계속 신경을 쓰는지 안쓰는지가 기준
블록 논블록의 차이는 사용자가 작업을 요청하고 결과를 받을 때까지 멈춰서 기다리느냐 멈추지 않고 다른 일을 할 수 있는지가 기준.concurrent.futures - 비동기 논블록 방식.
1. Executor
호출 가능한 객체를 비동기적으로 호출시켜주는 실행기. ThreadPool Executor/ProcessPoolExecutor
submit/map/shutdown 3가지 메서드만 사용
2. Future
호출 가능한 객체의 비동기 실행을 캡슐화. Executor에서 submit 메서드로 전달된 함수를 비동기로 실행하고, 실행된 결과나 현재 상태
를 조회할 수 있도록 만든 것. canceled/running/done, cancel/result/exception/add_done_callback
3. Module Functions
wait/as_completed 메서드 2가지만 제공.
# import time
# import concurrent.futures
#
# def worker(index) :
# print("worker index : %s" % index)
# time.sleep(index)
# return ("completed %s worker job" % index)
#
# def main() :
# future_list = []
# executor = concurrent.futures.ProcessPoolExecutor(max_workers=3) ## executor 객체 선언. 최대 프로세스 개수 설정.
# for i in range(5) :
# future = executor.submit(worker, i) ## 실행할 함수와 index 등록.
# future_list.append(future)
# time.sleep(1)
# for idx, future in enumerate(future_list) :
# if future.done() : ## future가 완료되었는지 확인.
# print("result : %s" % future.result())
# continue
# print("[%s worker] wait for 1 second because it has not finished yet." % idx)
# try :
# result = future.result(timeout=1)
# except concurrent.futures.TimeoutError :
# print("[%s worker] Timeout error" % idx)
# else :
# print("result : %s" % result)
# executor.shutdown(wait=False)
#
# if __name__ == "__main__" :
# main()
(실행 결과)
# worker index : 0
# worker index : 1
# worker index : 2
# worker index : 3
# result : completed 0 worker job
# [1 worker] wait for 1 second because it has not finished yet.
# worker index : 4
# result : completed 1 worker job
# [2 worker] wait for 1 second because it has not finished yet.
# [2 worker] Timeout error
# [3 worker] wait for 1 second because it has not finished yet.
# [3 worker] Timeout error
# [4 worker] wait for 1 second because it has not finished yet.
# [4 worker] Timeout error
# import time
# import concurrent.futures
#
# def worker(index) :
# print("worker index : %s" % index)
# time.sleep(index)
# return ("completed %s worker job" % index)
#
# def main() :
# with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor : ## with구문 사용으로 shutdown 생략
# future_list = []
# for i in range(5) :
# future = executor.submit(worker, i) ## 실행할 함수와 index 등록.
# future_list.append(future)
# print(future_list)
# finished, pending = concurrent.futures.wait(future_list, timeout =1, return_when=concurrent.futures.ALL_COMPLETED)
# print(finished)
# print(pending)
# for w in finished :
# print("finished worker : %s" % w.result())
# for w in pending :
# print("not finishe worker : %s" % w.result())
#
# if __name__ == "__main__" :
# main()
(실행 결과)
# [<Future at 0x1f61da0fd30 state=running>, <Future at 0x1f61da2a9b0 state=pending>,
# <Future at 0x1f61da2aac8 state=pending>, <Future at 0x1f61da2afd0 state=pending>,
# <Future at 0x1f61da3a0b8 state=pending>]
# worker index : 0
# worker index : 1
# worker index : 2
# worker index : 3
# worker index : 4
# {<Future at 0x1f61da3a0b8 state=finished returned str>, <Future at 0x1f61da2aac8 state=finished returned str>,
# <Future at 0x1f61da0fd30 state=finished returned str>, <Future at 0x1f61da2a9b0 state=finished returned str>,
# <Future at 0x1f61da2afd0 state=finished returned str>}
# set()
# finished worker : completed 4 worker job
# finished worker : completed 2 worker job
# finished worker : completed 0 worker job
# finished worker : completed 1 worker job
# finished worker : completed 3 worker job
'파이썬(PYTHON)' 카테고리의 다른 글
재귀적으로 HTML 페이지를 처리하는 예제 (0) | 2020.12.03 |
---|---|
파이썬의 비동기2 (0) | 2020.08.31 |
파이썬의 멀티프로세스(multiprocessing)3 (0) | 2020.08.30 |
파이썬의 멀티프로세스(multiprocessing)2 (0) | 2020.08.29 |
파이썬의 멀티프로세스(multiprocessing)1 (0) | 2020.08.28 |