Python/Advanced

[Python 비동기] (1) 코루틴, 비동기 관련 용어 이해

yubi5050 2023. 2. 8. 15:10

Python 비동기 배경

1. python 은 동기 기반으로 설계된 언어로 대부분의 내장 API들이 동기로 작동

2. python 의 비동기 방식(코루틴)들은 Generator를 이용해 비동기 코드를 작성함

3. python 3.4에 asyncio 라이브러리가 표준으로 채택

4. python 3.5에 async/await 키워드가 추가되며, 비동기 프로그래밍이 가능해짐

 

과거의 Python 비동기 구현은 generator를 이용해 Coroutine을 구현하는 것

현재의 Python 비동기 구현은 asyncio 라이브러리의 async/await 구문을 사용하여 구현하는 것

※ 여기서 과거란 python 3.5 버전 이전의 방식을 뜻함

 

Python 비동기 관련 용어 키워드

Subroutine : 특정 프로그램이 실행시 반복적으로 호출되거나 사용 될 수 있도록 하는 일련의 일반적인 코드들 (함수)

 

Coroutine : 특정 시점의 실행 상태를 잠시 저장해두고, 이후 그 상태를 복원하여 재개하는 서브루틴(비동기함수)을 의미

 

Generator : 코루틴 형태를 구현하기 위한 방법으로 yield 문법을 통해 함수를 임시적으로 중단 및 재실행 하는 방식 

- yield 문 호출시 해당 객체의 상태 정보 (스택, 실행 위치)등을 저장하며 일시적으로 중단

- 이후 next () 등을 통해 정보를 다시 불러와 중단점 이후 부터 다시 실행

 

Async/await : 비동기 처리 패턴의 구문으로 async 메소드 선언, await 객체 지정으로 코루틴을 구현하는 방식

- javascript의 callback 비동기 처리 방식을 보완하고 Promise 객체를 반환

- python의 asyncio 라이브러리에서 async/await 구문 사용

 

Awaitable 객체 : await 구문 뒤에 올 수 있는 객체로 코루틴(Coroutine) / 퓨처(Future) / 테스크(Task) / 프라미스(Promise) 객체 등이 있다.

- 해당 Awaitable 객체들의 특징과 방식에 따라 비동기 프로그래밍을 구현

- 코루틴 객체 : 비동기 함수 호출시 생성 및 반환

- 퓨처 객체 : 실행 상태 및 결과 저장

- 태스크 객체 : 실행 상태 및 결과 저장 + 실행 작업 개시

 

Awaitable 객체 (Future, Task) 비교

Future Object (퓨처 객체)

  • 퓨처 객체의 역할은 작업의 실행 상태 및 결과를 저장하는 것이며, 작업에 대해 진행 중(PENDING), 취소(CANCELLED), 완료(FINISHED) 상태를 가진다. 
  • 주요 메소드 : add_done_callback() 으로 해당 Future 객체가 완료되면 (CANCELLED, FINISHED), 실행 될 특정 함수를 등록한다.

 

Task Object (태스크 객체)

  • 테스크 객체의 역할은 작업의 실행 상태 및 결과 저장 + 실행 작업 개시를 수행하며, 기본적으로 퓨처 객체를 상속해 해당 객체의 가진 기능을 모두 포함한다. 
  • 기본적으로 테스크 객체는 생성시 자신의 스레드를 담당하는 event loop에 의해 관리되고, event loop는 Task들 중 우선순위가 높은 것을 적절히 선택하여 실행한다. 
  • 주요 메소드로는 asyncio.run() 또는 asyncio.create_task()가 있으며, 해당 메소드를 통해 Coroutine 객체를 넘겨주면 내부 스레드가 해당 Coroutine 객체를 Task 객체로 생성하여, 실행한다.

 

참고 문헌