[Fast API] 서브루틴 vs 코루틴

seoryeong·2023년 6월 19일
0

FastAPI

목록 보기
4/5
post-thumbnail

서브루틴코루틴
우리가 알고 있는 보통의 함수나 메소드
(메인 루틴을 보조하는 역할)
하나의 진입점과 하나의 탈출점이 있는 루틴
서브루틴의 일반화된 형태
다양한 진입점과 다양한 탈출점이 있는 루틴
파이썬 비동기 함수는 코루틴 함수로 만들 수 있다.
프로그램이 실행되면 서브 루틴은 별도의 공간에
해당 로직들을 모아 놓고 있다.
서브루틴이 호출이 될 때, 해당하는 로직들의
공간으로 이동했다가 return을 통해 원래 호출시점
(메인 루틴)으로 돌아오게 된다.
코루틴은 서브루틴과는 달리 해당 로직들이
진행되는 중간에 멈추어서 특정위치로 돌아갔다가
다시 코루틴에서 진행되었던 위치로 돌아와
나머지 로직을 수행할 수 있다.

📙서브루틴

def hello_world():
	print("hello world")
    
if __name__ == "__main__":
	print(hello_world())

📙코루틴

코루틴은 진입점과 탈출점이 여러개이다.
asyncio.sleep()은 asyncio안에 있는 sleep 메소드로 프로그램을 블로킹 시켜주는
코루틴 함수이다.

async def hello_world():
	print("hello world")
    
if __name__ == "__main__":
	await hello_world()

[에러발생] SyntaxError: 'await' outside function
→ await 키워드는 코루틴(async)안에서 사용되어야 한다.

import asyncio

async def hello_world():
	print("hello world")
    return 123
    
if __name__ == "__main__":
	asyncio.run(hello_world())

asyncio를 통해 코루틴 함수를 파이썬 스크립트에서 실행할 수 있도록 도와줌

[asyncio.run] : execute the coroutine coro and return the result
코루틴 함수를 실행하고 반환하는 함수

import asyncio

async def hello_world():
	await print("hello world")
    return 1234
    
if __name__ == "__main__":
	asyncio.run(hello_world())

[에러 발생] : TypeError: object NoneType can't be used in 'await' expression

awaitable 객체: ①코루틴(coroutine), ②테스크(task), ③퓨처(future)

테스크 (task)

import asyncio
import time

async def delivery(name, mealtime):
	print(f"{name}에게 배달 완료!!")
    await asyncio.sleep(mealtime)
    print(f"{name} 식사 완료, {mealtime} 시간 소요 ...")
    print(f"{name} 그릇 수거 완료")
    
async def main():
	task1 = asyncio.create_task(delivery("A",2))
    task2 = asyncio.create_task(delivery("B",1))
    
    await task1
    await task2

if __name__ == "__main__":
    start=time.time()
    asyncio.run(main())
    end = time.time()
    print(end-start)

task1 = asyncio.create_task(delivery("A",2))
→ 이건 실행하지 않고 task1에 예약해두는 것을 뜻한다. 변수에 예약된 작업을 담아둠

await task1 → task1 실행

profile
파이썬 개발자입니다.

0개의 댓글