본문 바로가기

코딩과 데이터 분석

Python에서의 동기화(Synchronous)와 비동기화(Asynchronous) 프로그래밍

Python에서 코드를 작성할 때, 동기화(Synchronous)와 비동기화(Asynchronous) 방식을 이해하는 것은 매우 중요합니다. 이 글에서는 동기화와 비동기화의 개념을 설명하고, 각각의 방식으로 코드를 작성하는 예시를 살펴보겠습니다.

동기화(Synchronous)는 코드가 순차적으로 실행되는 방식을 말합니다. 한 작업이 완료될 때까지 다음 작업은 대기 상태에 있으며, 작업의 실행 순서가 명확합니다. 이전 작업이 완료된 후에야 다음 작업이 시작되므로, 작업 간의 의존성이 있는 경우에 적합합니다. 동기화 방식은 코드의 흐름을 쉽게 이해할 수 있다는 장점이 있지만, 한 작업이 오래 걸리는 경우 전체 프로그램의 실행 속도가 느려질 수 있다는 단점이 있습니다.

반면에 비동기화(Asynchronous)는 작업을 병렬로 처리하는 방식입니다. 작업을 시작한 후 완료를 기다리지 않고 다음 작업을 진행할 수 있으며, 작업이 완료되면 결과를 받아 처리하는 콜백 함수나 핸들러가 호출됩니다. 비동기화는 작업 간의 의존성이 없는 경우에 적합하며, 여러 작업을 동시에 처리할 수 있어 전체 프로그램의 실행 속도를 향상시킬 수 있습니다. 하지만 코드의 흐름이 복잡해질 수 있고, 동시성 문제를 고려해야 한다는 단점이 있습니다.

아래는 동기화 방식으로 작성한 코드 예시입니다:

import time

def get_drink(drink_name):
    print(f"{drink_name} 주문 시작")
    make_drink(drink_name)
    print(f"{drink_name} 받음")

def make_drink(drink_name):
    print(f"{drink_name} 준비 중...")
    time.sleep(3)  # 음료 만드는 데 3초 걸린다고 가정
    print(f"{drink_name} 준비 완료!")

def main():
    start_time = time.time()

    drinks = ["아메리카노", "라떼", "스무디", "밀크티"]

    for drink in drinks:
        get_drink(drink)

    end_time = time.time()
    total_time = end_time - start_time
    print(f"총 소요 시간: {total_time:.2f}초")

main()

위 코드에서는 각 음료를 순차적으로 준비하므로 총 소요 시간은 음료 수에 비례하여 증가합니다.

다음은 비동기화 방식으로 작성한 코드 예시입니다:

import asyncio
import time

async def get_drink(drink_name):
    print(f"{drink_name} 주문 시작")
    await make_drink(drink_name)
    print(f"{drink_name} 받음")

async def make_drink(drink_name):
    print(f"{drink_name} 준비 중...")
    await asyncio.sleep(3)  # 음료 만드는 데 3초 걸린다고 가정
    print(f"{drink_name} 준비 완료!")

async def main():
    start_time = time.time()

    tasks = []
    drinks = ["아메리카노", "라떼", "스무디", "밀크티"]

    for drink in drinks:
        tasks.append(asyncio.create_task(get_drink(drink)))

    await asyncio.gather(*tasks)

    end_time = time.time()
    total_time = end_time - start_time
    print(f"총 소요 시간: {total_time:.2f}초")

asyncio.run(main())

비동기화 방식에서는 asyncio 모듈을 사용하여 비동기 작업을 처리합니다. async/await 키워드를 사용하여 비동기 함수를 정의하고, asyncio.create_task()를 사용하여 작업을 생성합니다. asyncio.gather()를 사용하여 모든 작업이 완료될 때까지 기다립니다. 이렇게 하면 여러 음료를 동시에 준비할 수 있어 총 소요 시간이 줄어듭니다.

동기화와 비동기화 방식은 상황에 따라 적절히 선택하여 사용해야 합니다. I/O 작업이 많거나 병렬 처리가 필요한 경우 비동기 방식을 사용하고, 작업 간의 의존성이 높거나 순차적인 실행이 필요한 경우 동기 방식을 사용하는 것이 좋습니다. Python에서는 asyncio 모듈을 통해 비동기 프로그래밍을 지원하므로, 필요에 따라 활용할 수 있습니다.

반응형