[파이썬] ASYNCIO 사용법 및 예제

이동욱

2021/09/05

Categories: 파이썬

ASYNCIO 기능

  • asyncio 이벤트 루프 사용하기
  • async/await 함수 호출하기
  • 루프에서 실행할 태스크 작성하기
  • 여러 개의 태스크가 완료되길 기다리기
  • 모든 병행 태스크 종료 후 루프 종료하기
import asyncio
import time


async def main():
    print(f'{time.ctime()} Hello!')
    await asyncio.sleep(1.0)
    print(f'{time.ctime()} GoodBye!')


asyncio.run(main())

import asyncio
import time


async def main():
    print(f'{time.ctime()} Hello!')
    await asyncio.sleep(1.0)
    print(f'{time.ctime()} GoodBye!')

loop = asyncio.get_event_loop() # 코루틴을 실행하기 위한 루프 인스턴스를 얻는 방법이다.
task = loop.create_task(main()) # create_task()를 호출해서 루프에 코루틴을 스케줄링 한다.
loop.run_until_complete(task) # 호출을 통해 현재 스레드를 블로킹 할 수 있다. 루프가 실행되는 동안 다른 작업들도 같이 실행된다. 
                              # asyncio.run() 도 내부에서 run_until_complete()를 호출하여 메인 스레드를 블로킹한다.
pending = asyncio.all_tasks(loop=loop)
for task in pending:
    task.cancel()
group = asyncio.gather(*pending, return_exceptions=True) # 루프 중지 증으로 블로킹 상태가 풀린 후에 아직 실행중인 태스크를 취합하고  
                                                         # 모든 태스크에게 취소 요청을 한 후에 loop.run_until_complete()를 호출하여 태스크들이 모두 종료 상태가 될 때까지 기다린다.
                                                         # asyncio.run()의 내부에서 위의 절차를 모두 포함한다.
loop.run_until_complete(group)
loop.close() # 보통 최종 동작이다. 모든 루프의 대기열을 비우고 익스큐터를 종료시킨다. asyncio.run() 내부에서는 호출될 때마다 신규 이벤트 루프를 생성하고 반환하기 전에 루프를 닫는다.

Asyncio의 계층

코루틴


async def f():
  return 123

>>> type(f)
>>> import inspect
>>> inspect.iscoroutinefunction(f)

await 키워드

import asyncio


async def f():
    await asyncio.sleep(0)
    return 123


async def main():
    result = await f()
    return result

참고 문헌

>> Home