코루틴

codakcodak·2023년 5월 2일
0

파이썬의 비동기적 프로그래밍을 위해서는 코루틴을 활용해야한다.

메인루틴

정의:프로그램의 주가 되는 코드의 흐름

코루틴 또는 서브루틴으로 이루어져 일련의 흐름을 생성한다.

서브루틴

정의:하나의 진입점과 하나의 탈출점을 갖고 있는 일반적인 함수나 메소드

예시코드

import time

#서브루틴
def delivery(name,mealtime):
    print(f"{name}에게 배달완료!")
    time.sleep(mealtime)
    print(f"{name}식사 완료, {mealtime}시간 소요...")
    print(f"{name}그릇수거 완료")
    
#서브루틴
def main():
    #A라는 사람은 음식을 3초동안 먹는다.
    delivery("A",5)
    #B라는 사람은 음식을 4초동안 먹는다.
    delivery("B",4)
    #C라는 사람은 음식을 5초동안 먹는다.
    delivery("C",3)
    
#메인루틴
if __name__=="__main__":
    start = time.time()
    result=main()
    print("실행시간 :", time.time() - start,"seconds")

코루틴

정의:여러개의 진입점과 여러개의 탈출점을 갖고 있는 함수

예시코드

import time
import asyncio

#코루틴
async def delivery(name,mealtime):
	#위의 인자==진입점 1
    print(f"{name}에게 배달완료!")
    #아래의 await==탈출점1
    await asyncio.sleep(mealtime)
    #위의 await==진입점2
    print(f"{name}식사 완료, {mealtime}시간 소요...")
    print(f"{name}그릇수거 완료")
    #생략된 retun==탈출점2
    
#코루틴
async def main():
    await asyncio.gather(
        delivery("A",5),
        delivery("B",4),
        delivery("C",3)
    )
    
#메인루틴
if __name__=="__main__":
    start = time.time()
    asyncio.run(main())
    print("실행시간 :", time.time() - start,"seconds")

서브루틴은 인자로 인해 하나의 진입점과 return으로 인해 하나의 탈출점을 갖지만 코루틴에서는 await구문으로 여러개의 진입점과 탈출점을 가질 수 있다.

코루틴의 사용법

  1. async/await

    import asyncio
    
    async def async_hello_world():
        print("Hello world")
        return True
    • 코루틴으로 만들고 싶은 함수에 async를 붙인다.
    • await는 async로 선언된 코루틴 안에서만 쓸 수 있다.
  2. asyncio.run()

    import asyncio
    
    async def async_hello_world():
        print("Hello world")
        return True
    
    if __name__=="__main__":
        asyncio.run(async_hello_world())
    • 코루틴의 실행을 위해선 최상단이 되는 asyncio.run()을 선언해 실행해야한다.
  3. await는 awaitable객체(코루틴,테스크,퓨처)만 사용될 수 있다.

    • 테스크(코루틴을 예약)
    import asyncio
    
    async def async_hello_world(keyword):
        print("Hello ",keyword)
        return True
    
    async def main():
    	#미리 코루틴을 변수로 생성한다.
        task1=asyncio.create_task(async_hello_world("영희"))
        task2=asyncio.create_task(async_hello_world("민수"))
    
        await task1
        await task2
    
    if __name__=="__main__":
        asyncio.run(main())
  4. asyncio.gather의 awaitable객체의 동시 실행

    import time
    import asyncio
    
    async def delivery(name,mealtime):
        print(f"{name}에게 배달완료!")
        await asyncio.sleep(mealtime)
        print(f"{name}식사 완료, {mealtime}시간 소요...")
        print(f"{name}그릇수거 완료")
    
        return name
    async def main():
        result=await asyncio.gather(
            delivery("A",5),
            delivery("B",4),
            delivery("C",3)
        )
    
        print("result:",result)
    
    if __name__=="__main__":
        start = time.time()
        asyncio.run(main())
        print("실행시간 :", time.time() - start,"seconds")
    $ python async_delivery.py
    A에게 배달완료!
    B에게 배달완료!
    C에게 배달완료!
    C식사 완료, 3시간 소요...
    C그릇수거 완료
    B식사 완료, 4시간 소요...
    B그릇수거 완료
    A식사 완료, 5시간 소요...
    A그릇수거 완료
    result: ['A', 'B', 'C']
    실행시간 : 5.0111119747161865 seconds
    (coding_test_env) 
profile
숲을 보는 코더

0개의 댓글