서브루틴 | 코루틴 |
---|---|
우리가 알고 있는 보통의 함수나 메소드 (메인 루틴을 보조하는 역할) 하나의 진입점과 하나의 탈출점이 있는 루틴 | 서브루틴의 일반화된 형태 다양한 진입점과 다양한 탈출점이 있는 루틴 파이썬 비동기 함수는 코루틴 함수로 만들 수 있다. |
프로그램이 실행되면 서브 루틴은 별도의 공간에 해당 로직들을 모아 놓고 있다. 서브루틴이 호출이 될 때, 해당하는 로직들의 공간으로 이동했다가 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 실행