#Python 3.7 Above
Python 3.7 Above Only Available --> Asyncio Lib
파이썬 Asyncio는
https://docs.python.org/ko/3/library/asyncio-task.html#coroutine
이곳에 자세히 나왔고,
중요한건 내가 왜 쓰려고 Asyncio에 접근하는지 이다.
시나리오는 이렇다.
1. Global 하게 Memory 에 위치한 List<Dict<str, float>> 데이터셋이 있다.
물론 다양한다.
2. 현재 매우 큰 시퀀스 데이터가 존재하고 이를 위에 명시한 Global 데이터와 연산 or 매칭을 통해서 가공하고자 한다.
3. 예를 들어 매우 큰 시퀀스 데이터가 100개, Global 데이터가 2개 있다고 가정하자.
4. 100개의 시퀀스 데이터는 for loop을 통해 Global 데이터와 어떠한 연산을 하는데, 각각의 loop에서 1초가 소요된다.
5. 가장 간단하게 Double loop를 통해서 실행하면 100초 * 2 = 200초가 소요된다.
6. 이걸 Asyncio 를 통해서 100개를 한 번에 실행할 수 있다면 소요되는 시간은 단 2초가 된다.
위 시나리오는 사실 간단한 로직으로 테스트 할 수 있었다.
import asyncio as aio
import time
# Python 3.7 Above Only
data = [i for i in range(100)]
async def postprocess(cnt, data):
print(f"Start {cnt}")
# Postprocess with data... Taken about 1 sec
await aio.sleep(1)
print(f"End {cnt}")
async def main():
global data
for _ in range(2): # Global Data == 2
tasks = []
for d in range(len(data)): # Sequence Data == 100
task = aio.create_task(postprocess(d, data))
tasks.append(task)
print(f"Tasks :: {len(tasks)}")
for i in tasks:
await i
def run():
start = time.perf_counter()
aio.run(main())
print(f"total time elapsed : {time.perf_counter() - start}")
if __name__ == '__main__':
aio.run(run())
실행결과는,
total time elapsed : 2.0214815
전체 Task의 갯수는 200이 된다.
100개의 Task를 한 번 돌리는데 약 1초,
나머지 100개의 Task를 한 번 더 돌리는데 약 1초.
아마도 나머지 0.0214815초는 print를 찍는데 썻나(?) 하는 생각이 든다.
위 방법을 쓰면 하나의 파일 WRITE 컨텍스트를 활용해서 빠르게 필요한 내용을 WRITE 할 수 있는 기능도 만들 수 있다.
이전에는
https://docs.python.org/ko/3/library/multiprocessing.html
을 통해서 구현하였는데,
(당시에는 파일 WRITE에 2시간 정도 소요되던 작업을 20분 안으로 줄였던 경험에 대해서)
환경에 맞게 필요한 Lib을 활용하면 구현은 사실 대동소이하다.