디테일하게는 꽤나 복잡하던데(망할 비동기 ㅠㅠ)


그래도 당장 써먹어보려고 파편화해서나마 정리해보는데

future는 이런 식으로 이해하고 다루는 것이 맞나?


import asyncio


# 이벤트 루프안에서 처리할 함수를 async와 await를 이용해 정의

async def slowJob(num, future):

    await asyncio.sleep(num)

    future.set_result('sleep {} seconds'.format(num))


def getResult(future):

    print(future.result())


# 이벤트 루프 생성

loop = asyncio.get_event_loop()


# 비동기적으로 움직이는 함수들의 결과값을 저장할 컨테이너에 해당하는 future를 생성

# 결국 멀티프로세싱의 큐나 Go의 채널과 비슷한 역할을 함

futures = [asyncio.Future() for _ in range(1, 6)]


# 함수들에 future를 심어줌

[asyncio.ensure_future(slowJob(num, futures[num - 1])) for num in range(1, 6)]


# 위의 함수들에서 future에 데이터가 채워지면 이 데이터들을 처리해줄 함수를 call하도록 함

[future.add_done_callback(getResult) for future in futures]


# 이벤트 루프를 돌리되 future 값들이 다 채워질 때까지

loop.run_until_complete(asyncio.gather(*futures))


slowJob들이 동시에 움직이는 건 확인했는데

과정 이해를 잘 한 건지..


task로 하는 법도 해놓기는 했는데 그게 그거더라.