루틴 : 일련의 명령
메인 루틴 : 프로그램의 메인 코드의 흐름
서브 루틴
코루틴
서브 루틴의 일반화된 형태
다양한 진입점과 다양한 탈출점이 있는 루틴
코루틴은 서브루틴과는 다르게 해당 로직들이 진행되는 중간에 멈추어서 특정 위치로 돌아 갔다가 다시 코루틴에서 진행되었던 위치로 돌아와 나머지 로직을 수행할 수 있다.
아래 코드는 진입점이 2개, 탈출점이 2개
import asyncio
async def delivery(name, mealtime): # 진입점
print(f"{name}에게 배달 완료!")
await asyncio.sleep(mealtime) # 탈출점, 진입점
# await : 비동기 -> 동기
print(f"{name} 식사 완료, {mealtime}시간 소요...")
print(f"{name} 그릇 수거 완료")
return mealtime # 탈출점
# 비동기 함수는 atomic한 연산을 요구할 때는 좋지 않다 (덧셈과 같은 사칙연산들)
# 요청을 받고 응답을 받는 류의 코드에 유용
# 비동기 처리는 코드가 진행되다가 다른 함수를 처리하고 다시 이어서 진행하기도 한다
# 코드가 반드시 작성된 순서대로 진행되지 않는다는 것
# 비동기 함수를 async 키워드를 붙여서 코루틴 함수라고 부른다.
파이썬 비동기 함수는 코루틴 함수로 만들 수 있다.
https://docs.python.org/ko/3/library/asyncio-task.html
import asyncio
async def hello_world():
print("hello world")
return 123
# await 키워드는 async 안에서 사용되어야 한다.
# await은 awaitable 한 객체에서만 사용될 수 있다.
if __name__ == "__main__":
asyncio.run(hello_world())
# asyncio를 통해 async 함수를 파이썬 메인 루틴 안에서 돌림
최상위 진입점 “main()” 함수를 실행하는 asyncio.run()
함수
우리는 객체가 await
표현식에서 사용될 수 있을 때 어웨이터블 객체라고 말합니다.