[개발] 파이썬

9.2.2. 비동기 프로그래밍

브랜든정 2024. 12. 30. 13:15
반응형

파이썬 비동기 프로그래밍

비동기 프로그래밍은 현대의 소프트웨어 개발에서 필수적인 기술 중 하나입니다. 파이썬은 이러한 비동기 프로그래밍을 위해 asyncio 모듈을 제공하며, 이를 통해 효율적인 비동기 작업을 수행할 수 있습니다. 이 글에서는 파이썬의 Event Loop를 중심으로 비동기 프로그래밍의 개념과 구현 방법을 자세히 설명하겠습니다.

비동기 프로그래밍의 목적

비동기 프로그래밍의 주요 목적은 성능 향상과 자원 활용 최적화를 통해 사용자 경험을 개선하고 서비스의 확장성을 증대시키는 것입니다. 특히 I/O 바운드 작업(네트워크 요청, 파일 입출력 등)에서 대기 시간 동안 다른 작업을 수행하여 시스템의 효율성을 높입니다

주요 구성 요소

비동기 프로그래밍의 주요 구성 요소는 Event Loop, Coroutine, Task, Future 등입니다.

Event Loop

Event Loop는 비동기 작업을 관리하고 실행 순서를 제어하는 핵심 메커니즘입니다. asyncio 모듈을 사용하여 Event Loop를 생성하고, 이를 통해 비동기 작업을 관리할 수 있습니다. 예를 들어, asyncio.get_event_loop()를 사용하여 Event Loop를 생성할 수 있습니다.

loop = asyncio.get_event_loop()

Coroutine

Coroutine은 async def로 정의된 비동기 함수입니다. await을 사용하여 비동기 실행을 기다리며, 다른 작업을 수행할 수 있습니다. Coroutine은 다른 작업을 기다리기 위해 suspend 상태로 전환할 수 있어, 다른 작업이 수행될 수 있도록 합니다.

async def blink_led():
    while True:
        green_led.toggle()
        await asyncio.sleep(2)

Task

Task는 Coroutine을 래핑하고, 실행을 관리하는 객체입니다. 여러 비동기 작업을 동시에 실행할 수 있게 함으로써, 시스템의 효율성을 높입니다. Task를 생성하기 위해 asyncio.create_task()를 사용할 수 있습니다.

loop.create_task(blink_led())

Future

Future는 미래에 완료될 비동기 작업의 결과를 나타내는 객체입니다. 작업의 완료를 기다리고 결과를 검색할 수 있습니다. Future를 사용하여 비동기 작업의 완료를 확인할 수 있습니다.

비동기 작업 실행

비동기 작업을 실행하기 위해서는 Event Loop를 시작하고, Task를 생성하여 실행해야 합니다. Event Loop는 continually tasks를 확인하고, 실행합니다. 예를 들어, 다음과 같이 Event Loop를 시작하고, Task를 생성하여 실행할 수 있습니다.

loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()

Asynchronous Delay

비동기 작업에서 delay를 introduces하기 위해서는 asyncio.sleep()를 사용합니다. asyncio.sleep()는 coroutine을 suspend 상태로 전환하여, 다른 작업을 수행할 수 있도록 합니다. 예를 들어, 다음과 같이 delay를 introduces할 수 있습니다.

await asyncio.sleep(2)

예제 코드

비동기 프로그래밍을 실습하기 위해, LED를 blink하는 예제 코드를 작성해 보겠습니다. 이 예제 코드에서는 Event Loop를 사용하여 두 개의 LED를 동시에 blink하는 코드를 작성하였습니다.

import asyncio

# Define coroutine function
async def blink_green_led():
    while True:
        green_led.toggle()
        await asyncio.sleep(2)

# Define coroutine function
async def blink_blue_led():
    while True:
        blue_led.toggle()
        await asyncio.sleep(0.5)

# Define the main function to run the event loop
async def main():
    # Create tasks for blinking two LEDs concurrently
    asyncio.create_task(blink_green_led())
    asyncio.create_task(blink_blue_led())

# Create and run the event loop
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()

이 코드를 실행하면, 두 개의 LED가 동시에 blink하는 것을 확인할 수 있습니다. Event Loop는 continually tasks를 확인하고, 실행하여, LED를 동시에 blink하는 것을 가능하게 합니다.

비동기 작업을 실행하기 위해, 파이썬은 Async/Await 문법을 제공합니다. Async/Await 문법을 사용하여, 비동기 함수를 정의하고, 비동기 작업을 실행할 수 있습니다.

Async/Await 문법

Async/Await 문법을 사용하여, 비동기 함수를 정의할 수 있습니다. 예를 들어, 다음과 같이 비동기 함수를 정의할 수 있습니다:

import asyncio

async def my_async_function():
    # 비동기 작업을 수행합니다.
    await asyncio.sleep(1)
    print("비동기 작업이 완료되었습니다.")

# 비동기 함수를 실행합니다.
asyncio.run(my_async_function())

비동기 작업의 예

비동기 작업의 예를 살펴보겠습니다. 예를 들어, 다음과 같이 네트워크 요청을 보내는 비동기 함수를 정의할 수 있습니다:

import asyncio
import aiohttp

async def fetch_data(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        data = await fetch_data(session, "https://example.com")
        print(data)

# 비동기 함수를 실행합니다.
asyncio.run(main())

비동기 프로그래밍의 장점

비동기 프로그래밍의 장점은 다음과 같습니다.

1 성능 향상

비동기 프로그래밍을 사용하면, 프로그램의 성능을 크게 향상시킬 수 있습니다. 예를 들어, 네트워크 요청을 보내는 동안 다른 작업을 수행할 수 있습니다.

2 자원 활용 최적화

비동기 프로그래밍을 사용하면, 프로그램이 자원을 효율적으로 사용할 수 있습니다. 예를 들어, I/O 바운드 작업을 수행하는 동안 CPU를 다른 작업에 할당할 수 있습니다.

3 사용자 경험 개선

비동기 프로그래밍을 사용하면, 프로그램의 사용자 경험을 개선할 수 있습니다. 예를 들어, 네트워크 요청을 보내는 동안 다른 작업을 수행할 수 있습니다.

비동기 프로그래밍의 실제 예

비동기 프로그래밍의 실제 예를 살펴보겠습니다. 예를 들어, 다음과 같이 비동기 프로그래밍을 사용하여, 프로그램의 성능을 향상시킬 수 있습니다:

import asyncio
import time

async def my_async_function():
    # 비동기 작업을 수행합니다.
    await asyncio.sleep(1)
    print("비동기 작업이 완료되었습니다.")

# 비동기 함수를 실행합니다.
start_time = time.time()
await asyncio.gather(my_async_function(), my_async_function())
end_time = time.time()
print(f"비동기 작업이 완료되었습니다. ({end_time - start_time}초)")

결론

파이썬의 Event Loop를 사용하여 비동기 프로그래밍을 수행하면, 성능 향상과 자원 활용 최적화를 통해 사용자 경험을 개선하고 서비스의 확장성을 증대시킬 수 있습니다. Event Loop는 비동기 작업을 관리하고, 실행 순서를 제어하는 핵심 메커니즘으로, Coroutine과 Task를 사용하여 여러 비동기 작업을 동시에 실행할 수 있습니다. 또한, asyncio.sleep()를 사용하여 delay를 introduces할 수 있으며, Future를 사용하여 비동기 작업의 완료를 확인할 수 있습니다. 이러한 기술을 활용하여, 효율적인 비동기 프로그래밍을 수행할 수 있습니다.

반응형

'[개발] 파이썬' 카테고리의 다른 글

10.2. 코드 품질과 디버깅  (0) 2024.12.30
10.1. 유닛 테스트  (0) 2024.12.30
9.2.1. 멀티스레딩과 멀티프로세싱  (0) 2024.12.30
9.1.2. HTTP 요청 처리  (0) 2024.12.30
9.1.1. 소켓 프로그래밍  (0) 2024.12.30