asyncio

노재원·2022년 11월 14일
0

python

목록 보기
2/3

서론

파이썬은 기본적으로 싱글 쓰레드로 동작하기 때문에 I/O 작업의 경우에 비동기적으로 프로그래밍 하면 훨씬 효율적으로 application을 구현할 수 있다. 파이썬에서는 asyncio라는 라이브러리를 사용하여 비동기 프로그래밍을 할 수 있다.

코루틴

  • 함수 정의할 때 맨 앞에 async 키워드를 붙이면 코루틴 함수가 된다.
  • 코루틴은 일반 함수와 달리 함수 중간에 멈출 수 있으며, 그 동안에 다른 코루틴 함수가 실행될 수 있다.
  • 코루틴 함수는 EventLoop에 등록되어야 실행되기 때문에 await 키워드를 붙이거나 Future혹은 Task로 감싸서 실행시켜줘야 한다.

EventLoop

  • 내부에 코루틴들을 등록할 queue가 있어서, queue에 등록된 코루틴들을 한번씩 번갈아가면서 실행시킨다.
  • OS의 스케쥴러와 같은 역할을 하지만 선점형인 스케쥴러와 달리 EventLoop는 비선점형이기 때문에 실행중인 코루틴에서 awaitreturn으로 실행권을 EventLoop로 넘겨줘야, 다른 코루틴을 실행시킬 수 있다.

    await의 역할

    1. await 키워드 뒤에 있는 코루틴을 EventLoop에 등록한다.
    2. await을 호출한 주체(ex. main)이 코루틴이 끝나면 실행권을 다시 돌려받기를 기대하며 실행권을 EventLoop로 넘긴다.
  • 2개의 코루틴이 EventLoop에 등록되서 실행과정을 그림으로 살펴보자
  • 각 코루틴에서 await 이나 return을 만나면 실행권이 EventLoop로 넘어가고, EventLoop는 자신의 queue에 담긴 다른 코루틴을 실행시킨다.
  • 이 때 await으로 잠시 멈춘 코루틴은, await이 호출된 지점에서 멈춰있다가 다시 EventLoop로부터 실행될 때는 멈춰있던 지점부터 이어서 다시 실행된다.

Future

  • 파이썬에만 있는게 아닌 비동기 프로그래밍에서 사용되는 개념으로, 비동기 함수의 연산 결과를 저장하는 객체를 말한다.
  • 비동기 함수는 호출된 그 자리에서 바로 결과를 주지 않기 때문에 나중에 함수가 끝나면 Future 객체에 결과값을 채워지길 기대한다.
  • 파이썬에서 고수준으로 사용할 때는 직접적으로 다루진 않는다.

Task

  • 코루틴을 실행시키는 방법 중 하나로, 그냥 await로 실행시킬 때와 달리 실행권을 EventLoop로 넘기지 않으면서 바로 EventLoop에 등록시킨다.
  • 따라서 Task로 실행시키면 코루틴이 끝나는 걸 기다리지 않아도 된다.
  • 동시성을 위한, 즉 비동기 프로그래밍할 때 코루틴을 task로 실행시키면 된다.

지금까지는 asyncio의 핵심 컴포넌트의 개념에 대해 살펴봤고, 다음 포스트에서 코드와 함께 살펴보자

0개의 댓글