본문 바로가기

Python

[Coroutine] 코루틴이란 무엇인가?

728x90
반응형

코루틴(Coroutine)은 파이썬에서 비동기 프로그래밍을 지원하기 위한 기능 중 하나입니다. 코루틴은 일반 함수와 달리 실행을 중단하고 다시 재개할 수 있는 특성을 가지고 있습니다. 이는 특히 I/O 바운드 작업(예: 파일 읽기/쓰기, 네트워크 요청 등)에서 효율적으로 사용됩니다. 코루틴을 이용하면 동기적으로 수행되는 작업을 비동기적으로 처리하여 성능을 향상시킬 수 있습니다.

코루틴의 특징

  1. 비동기 작업 처리: 코루틴은 I/O 작업을 비동기적으로 처리하여 프로그램의 효율성을 높입니다.
  2. 상태 유지: 코루틴은 실행 상태를 유지하고, 실행을 중단한 지점부터 다시 시작할 수 있습니다.
  3. 이벤트 루프: 코루틴은 이벤트 루프와 함께 동작하여 여러 작업을 병렬적으로 수행할 수 있습니다.

코루틴 작성 및 사용법

파이썬에서 코루틴을 작성하고 사용하는 방법은 다음과 같습니다:

1. async와 await 키워드

  • async def: 코루틴 함수를 정의합니다.
  • await: 코루틴 내부에서 다른 코루틴의 실행을 기다릴 때 사용합니다
import asyncio

# 코루틴 함수 정의
async def my_coroutine():
    print("코루틴 시작")
    await asyncio.sleep(1)
    print("코루틴 종료")

# 이벤트 루프에서 코루틴 실행
asyncio.run(my_coroutine())

2. 이벤트 루프

  • asyncio.run(): 코루틴을 실행하기 위해 이벤트 루프를 시작합니다.
  • asyncio.create_task(): 코루틴을 태스크로 생성하여 병렬로 실행합니다.
import asyncio

async def task1():
    print("태스크 1 시작")
    await asyncio.sleep(2)
    print("태스크 1 종료")

async def task2():
    print("태스크 2 시작")
    await asyncio.sleep(1)
    print("태스크 2 종료")

async def main():
    # 코루틴을 병렬로 실행
    task1_coro = asyncio.create_task(task1())
    task2_coro = asyncio.create_task(task2())
    
    await task1_coro
    await task2_coro

# 이벤트 루프에서 메인 코루틴 실행
asyncio.run(main())

3. 비동기 제너레이터

비동기 제너레이터는 async for와 async yield 키워드를 사용하여 비동기적으로 값을 생성할 수 있습니다

import asyncio

# 비동기 제너레이터 함수 정의
async def async_gen():
    for i in range(3):
        await asyncio.sleep(1)
        yield i

# 비동기 제너레이터 사용
async def main():
    async for value in async_gen():
        print(value)

asyncio.run(main())

코루틴의 장점

  1. 효율적인 I/O 작업: 코루틴을 사용하면 I/O 작업 중에 다른 작업을 병렬로 처리할 수 있어 효율적입니다.
  2. 간단한 비동기 코드 작성: async와 await 키워드를 사용하여 비동기 코드를 작성하는 것이 간단합니다.
  3. 높은 성능: 비동기 작업을 효율적으로 처리하여 성능을 향상시킬 수 있습니다.

코루틴의 단점

  1. 디버깅 어려움: 비동기 코드의 흐름을 따라가는 것이 어렵고, 디버깅이 까다로울 수 있습니다.
  2. 복잡성 증가: 비동기 로직을 추가하면 코드의 복잡성이 증가할 수 있습니다.

파이썬 코루틴은 비동기 프로그래밍에서 중요한 역할을 하며, 이를 활용하면 네트워크 요청, 파일 I/O 등에서 성능을 크게 향상시킬 수 있습니다.

728x90
반응형