디테일하게는 꽤나 복잡하던데(망할 비동기 ㅠㅠ)
그래도 당장 써먹어보려고 파편화해서나마 정리해보는데
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로 하는 법도 해놓기는 했는데 그게 그거더라.
댓글 0