728x90

루틴(Routine)

  • 파이썬에서 루틴은 함수(function)를 가리킴
  • 일반적으로 루틴은 함수의 형태를 가지고 있으며, 코드 블록을 실행하여 특정한 작업을 수행
  • 함수를 호출하면 루틴이 실행되고, 실행이 완료되면 결과를 반환하거나 호출자에게 제어를 반환
def my_routine():
    print("This is a routine")

my_routine()  # 루틴 호출

서브루틴(Subroutine)

  • 파이썬에서 서브루틴은 함수(function)의 하위 개념으로 사용됨
  • 일반적으로 반복되는 코드를 재사용하기 위해 만들어진 함수를 가리킴
  • 다른 함수나 메소드 내에서 호출되어 실행되며, 실행이 완료되면 호출자에게 제어를 반환함
def my_subroutine():
    print("This is a subroutine")

def my_routine():
    print("Before subroutine")
    my_subroutine()  # 서브루틴 호출
    print("After subroutine")

my_routine()  # 루틴 호출

코루틴(Coroutine)

  • 파이썬에서 코루틴은 비동기 프로그래밍을 위해 사용되는 특별한 종류의 함수
  • 코루틴은 실행 중에 일시 중단되고 다시 시작될 수 있는 함수
  • 여러 번 호출될 수 있으며, 실행이 중단된 후 나중에 다시 호출되면 이전 상태를 기억하고 계속 진행함
import asyncio

# 코루틴 함수 정의
async def producer(queue, num):
    for i in range(num):
        print(f"Producing {i}")
        await queue.put(i)  # 데이터를 큐에 넣음
        await asyncio.sleep(0.5)  # 비동기 대기

async def consumer(queue):
    while True:
        data = await queue.get()  # 큐에서 데이터를 가져옴
        print(f"Consuming {data}")
        await asyncio.sleep(1)  # 비동기 대기

async def main():
    queue = asyncio.Queue()  # 비동기 큐 생성

    # producer와 consumer를 비동기적으로 실행
    await asyncio.gather(
        producer(queue, 5),
        consumer(queue)
    )

# 이벤트 루프를 생성하고 main 함수를 실행
asyncio.run(main())

이 코드에서는 async def 키워드를 사용하여 비동기 코루틴인 producer와 consumer 함수를 정의

producer 함수는 주어진 개수의 데이터를 생성하여 큐에 넣음

consumer 함수는 큐에서 데이터를 가져와서 소비함

main 함수에서는 asyncio.gather()를 사용하여 producer와 consumer를 동시에 실행하고, 이를 위해 이벤트 루프에 등록

이 코드를 실행하면 두 코루틴이 비동기적으로 실행되고, 데이터를 주고받으며 동작하는 것을 확인할 수 있음

서브루틴과 코루틴의 차이

  • 실행 흐름 제어
    • 서브루틴은 일반적인 함수처럼 호출되어 실행되고, 실행이 완료되면 호출자에게 제어를 반환
      일반적인 함수 호출과 동일한 방식으로 작동
    • 코루틴은 실행 중에 일시 중단되고 다시 시작될 수 있는 함수
      코루틴은 실행 중에 제어를 호출자에게 반환하고 다시 호출될 때 이전 상태를 기억하고 실행을 계속함
  • 동시성과 비동기성
    • 서브루틴은 동기적으로 호출되어 실행되며, 실행이 완료될 때까지 호출자는 대기
    • 코루틴은 비동기적으로 호출되어 실행되며, 실행 중에 다른 작업을 수행하거나 대기할 수 있음
      이를 통해 동시성을 지원하고 비동기 작업을 수행 가능
  • 호출 주체
    • 서브루틴은 일반적으로 호출자가 서브루틴을 호출하고 실행
      호출자는 서브루틴이 실행을 완료할 때까지 기다리고, 결과를 반환받음
    • 코루틴은 보통 이벤트 루프(Event Loop)나 다른 코루틴에 의해 호출되고 실행됨
      코루틴은 다른 코루틴이나 이벤트 루프에게 제어를 넘기고, 나중에 다시 실행됨

정리하면 서브루틴은 일반적인 함수 호출과 동일한 방식으로 실행되며, 실행이 완료될 때까지 호출자는 대기함

반면에  코루틴은 실행 중에 중단 및 재개가 가능한 비동기 함수이며, 동시성을 지원하고 호출자와 제어를 주고받는 동안 다른 작업을 수행할 수 있음

 

728x90

'Python' 카테고리의 다른 글

asyncio를 이용한 Python 비동기 프로그래밍  (0) 2024.04.10
Python websocket  (0) 2024.04.08
Python multiprocessing  (0) 2024.04.04
파이썬 사용자 정의 에러  (0) 2024.04.02
데코레이터  (0) 2024.04.01

+ Recent posts