홍카나의 공부방

[Python] 파이썬 코루틴 개념 정리 본문

Programming Language/Python

[Python] 파이썬 코루틴 개념 정리

홍문관카페나무 2024. 6. 15. 22:10

 

동기와 비동기

코드가 순차적으로 진행되는 방식을 동기적 처리라고 하고, 그렇지 않은 방식을 비동기적 처리라고 한다.

 

 

루틴(routine)

루틴은 일련의 명령, 코드의 흐름을 의미한다. 즉, 메인 루틴은 프로그램의 주요 실행 흐름을 담당하는 코드 부분을 의미한다. (보통 프로그램이 실행될 때 가장 먼저 시작되는 루틴이다.) 서브 루틴은 메인 루틴이 아닌 루틴을 의미한다. 일반적으로 메인이 아닌 함수나 메소드를 생각하면 된다. 서브루틴은 특정 작업을 수행하기 위해 호출되며, 하나의 진입점과 탈출점을 가지고 있다.

 

 

코루틴(Coroutine)

다양한 진입점과 다양한 탈출점이 있는 루틴을 의미한다. 중간에 실행을 멈추고 다른 작업을 수행한 후, 다시 원래 상태로 돌아와서 실행을 이어갈 수 있는 루틴이다. 비동기 프로그래밍에서 매우 유용하게 사용되는 방식이다. 구현과 관련된 자세한 내용은 아래 공식 문서를 참고하자.

 

https://docs.python.org/ko/3/library/asyncio-task.html

 

Coroutines and Tasks

This section outlines high-level asyncio APIs to work with coroutines and Tasks. Coroutines, Awaitables, Creating Tasks, Task Cancellation, Task Groups, Sleeping, Running Tasks Concurrently, Eager ...

docs.python.org

 

# https://docs.python.org/ko/3.11/library/asyncio-task.html
import asyncio

async def helloWorld(times):
    print("hell world!")
    await asyncio.sleep(times)
    print(f"sorry, it's... hello world! -- {times} sec")
    return times

async def printBooking():
    # helloWorld 코드를 태스크로 Wrapping하여 예약하기
    task1 = asyncio.create_task(helloWorld(2))
    task2 = asyncio.create_task(helloWorld(1))

    # asyncio.Task 객체
    # print(type(task1))
    
    # 예약 실행
    await task2
    await task1

    # 동시에 태스크 실행하기 (동시성 수행)
    result = await asyncio.gather(
        helloWorld(1),
        helloWorld(2)
    )
    print(result)

if __name__ == "__main__":
    asyncio.run(helloWorld(1))
    asyncio.run(printBooking())

 

코드로 직접 살펴 보고 몇 가지 정리를 하였다.

  • 코루틴은 asyncawait함께 사용하여 정의할 수 있다.
  • 그리고 코루틴을 실행하기 위해서는, asyncio.run() 함수를 이용한다.
  • await 표현식과 사용할 수 있는 객체는 어웨이터블(awaitable) 객체다. 코루틴, 태스크, 퓨처 유형이 사용 가능하다.
  • 태스크로 코루틴을 동시에 예약하는 데 사용할 수 있다.
  • asynicio.gather()를 이용해서 어웨이터블 객체를 동시에 실행할 수 있다. 모든 어웨이터블이 성공적으로 완료되면, 반환된 값들이 합쳐진 리스트가 반환된다.

 

 


+ 추가) I/O Bound, CPU Bound, Blocking

(1) I/O Bound

  • 프로그램의 실행이 디스크, 네트워크, 메모리 등의 I/O 작업 속도에 의해 성능이 제한되는 경우를 의미한다.
  • 흔히 파일 입출력시 I/O Bound를 생각하면 쉽고, 서버로 요청을 보낼 때 응답까지 걸리는 시간도 네트워크에서의 I/O Bound로 설명할 수 있다.

(2) CPU Bound

  • 프로그램의 실행이 CPU의 계산 능력에 의해 성능이 제한되는 경우를 의미한다.
  • CPU Bound 작업(또는 코드)은 CPU가 많은 계산을 수행해야 하기 때문에 CPU의 성능이 중요하다. CPU 성능이 좋아지면, CPU Bound를 감소시킬 수도 있다.

(3) Blocking

  • 한 작업이 완료되기 전까지 다른 작업의 실행이 지연되거나 멈추는 현상을 의미한다.

 

반응형