Python 비동기 함수

김윤하·2023년 9월 24일

Python

목록 보기
9/11

1. 동기 ? 비동기 ?

python에서 비동기를 구현하기 위해서는 많은 것이 필요하다. 우선 동기와 비동기는 무엇인가? 느낌적인 이해는 쉽지만 말로 설명하라고 했을때 명쾌한 답이 나오기 어려운 개념이라고 생각된다.

  • 동기 : 요청과 요청의 결과가 동시에 일어난다
  • 비동기 : 요청과 요청에 대한 결과가 동시에 일어나지 않는다
    -> 요청과 응답의 순서가 보장 되는가 안되는가의 차이

2. routine과 subroutine 그리고 coroutine

  • 루틴과 서브루틴
    함수를 호출하는 쪽을 루틴이라 부르며 호출된 함수를 서브루틴이라고 한다.루틴이 서브루틴을 호출한 경우 루틴은 대기 상태에 들어가게 되고 서브루틴이 종료되면 흐름이 다시 루틴으로 돌아오게 된다.
  • 코루틴
    코루틴에서 'Co'는 with 또는 together를 뜻한다. 즉, 메인 루틴과 서브 루틴이 서로 대등한 관계라는 것이다. 코루틴은 실행권한을 주고 받으면서 현재상태를 저장하고 나중에 다시 실행을 재개할 수 있다.
    일시중단(suspend)과 재개(resume)를 할 수 있는 서브 루틴

3. python coroutine

파이썬에서는 async와 await를 활용한 네이티브 코루틴(Native Coroutine)과 yield를 활용한 제너레이터 기반 코루틴(Generator-based Coroutine) 두가지 코루틴이 있으며 네이티브 코루틴(Native Coroutine)를 다룰 것이다.

  • async를 통해 코루틴 함수 만들기
  • await를 통해 I/O 대기 등이 있을 경우 다른 코드 라인을 실행
    awaitable 객체인 코루틴, 테크스, 피쳐를 통해 실행의 흐름을 바꾼다.
    태스크(task) : 태스크는 코루틴을 동시에 예약하는 데 사용됩니다.
    피쳐(feature) : 비동기 연산의 최종 결과를 나타내는 특별한 저수준 어웨이터블 객체입니다.
  • 그 밖에 asyncio 안의 다양한 함수들은 공식 문서를 보면서 공부하는게 좋을 것 같다.

4. 사용

글쓴이는 회사에서 asyncio, AIOHTTP를 활용한 I-O bound 작업을 줄이기 위해 비동기 함수를 사용하였고 상대 서버 상황에 따라서 비동기에 대한 제약도 많이 생길 수 있다는 것을 느꼈고 cs 개념적으로도 중요한 공부였다고 생각한다.

# 일반적인 routine subroutine
def add(a, b):
	return a + b

def main():
	a = 1
    b = 2
    c = add(a, b)

main()
-----------------------------------
# 비동기 함수
async def sleeping(sec):
    print(f'{sec} 진입시간 : {datetime.datetime.now()}')
    await asyncio.sleep(sec)
    print(f'{sec} 종료시간 : {datetime.datetime.now()}')
    return sec

async def main():
    task = [asyncio.create_task(sleeping(sec)) for sec in range(1, 4)]
    task_result = await asyncio.gather(*task)
    return task_result

result = asyncio.run(main())

참조

https://webclub.tistory.com/605
https://docs.python.org/ko/3/library/asyncio-task.html

profile
data engineer

0개의 댓글