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 객체로 생성하여, 실행한다.
참고 문헌
- https://it-eldorado.tistory.com/159 // 비동기 프로그래밍 동작 원리 (asyncio)
- https://docs.python.org/ko/3/library/asyncio.html // Docs - asyncio 비동기 I/O
'Python > Advanced' 카테고리의 다른 글
[Python 비동기] (3) Library, Framework 특징 비교 (0) | 2023.02.09 |
---|---|
[Python 비동기] (2) Generator, Async/await 코루틴 코드 비교 (0) | 2023.02.09 |
[Pytest] 4. Pytest with Django (Feat. pytest-Django) (0) | 2022.11.06 |
[Pytest] 3. Pytest 문법 (Feat. fixture, parametize) (0) | 2022.11.06 |
[Pytest] 2. Pytest 명령어 옵션 (command) (0) | 2022.11.05 |