Akashic Records

11.3 비동기 프로그래밍 본문

Python for Beginners

11.3 비동기 프로그래밍

Andrew's Akashic Records 2023. 4. 1. 22:14
728x90

파이썬의 비동기 프로그래밍은 일반적으로 asyncio 라이브러리를 사용하여 구현합니다. 비동기 프로그래밍은 여러 작업을 동시에 실행하면서, I/O 바운드 작업을 효율적으로 처리하는 데 유용합니다. 비동기 프로그래밍에서는 이벤트 루프를 사용하여 작업을 스케줄링하고, async와 await 키워드를 사용하여 비동기 함수를 작성합니다.

간단한 비동기 프로그래밍 예제는 다음과 같습니다:

import asyncio

async def say_hello(name, delay):
    await asyncio.sleep(delay)
    print(f"Hello, {name}!")

async def main():
    task1 = asyncio.create_task(say_hello("Alice", 2))
    task2 = asyncio.create_task(say_hello("Bob", 1))
    task3 = asyncio.create_task(say_hello("Charlie", 3))

    await asyncio.gather(task1, task2, task3)

# 이벤트 루프 실행
asyncio.run(main())

 

위 코드에서는 세 개의 비동기 함수 say_hello를 실행하고, 각각 다른 지연 시간을 설정했습니다. 이벤트 루프는 지연 시간이 끝날 때까지 기다린 후 해당 함수가 완료되면 결과를 출력합니다.

비동기 프로그래밍에서는 주로 다음과 같은 기능을 사용합니다:

  1. async def: 비동기 함수를 정의합니다.
  2. await: 비동기 함수를 호출하고, 작업이 완료될 때까지 기다립니다.
  3. asyncio.create_task(): 비동기 함수를 실행하기 위한 태스크를 생성합니다.
  4. asyncio.gather(): 여러 비동기 태스크를 병렬로 실행하고, 모든 작업이 완료될 때까지 기다립니다.
  5. asyncio.sleep(): 비동기 지연을 구현하는 데 사용됩니다. 일반적인 time.sleep()과 달리, 이 함수는 이벤트 루프를 차단하지 않고 다른 작업을 실행할 수 있습니다.
  6. asyncio.run(): 주어진 코루틴을 실행하고 완료될 때까지 기다리는 이벤트 루프를 시작합니다.

비동기 프로그래밍은 웹 서버, 네트워크 I/O, 웹 스크래핑 등 I/O 바운드 작업에서 성능 향상을 얻는 데 유용합니다.

 

비동기 프로그래밍은 파일 처리, 웹 요청 및 데이터베이스 작업과 같은 I/O 바운드 작업에서 특히 유용합니다. 이러한 작업에서는 작업의 완료를 기다리는 동안 CPU 리소스를 효율적으로 활용하고, 여러 작업을 동시에 수행할 수 있습니다.

예를 들어, aiohttp 라이브러리를 사용하여 비동기 웹 요청을 처리하는 방법을 살펴보겠습니다. 먼저 aiohttp를 설치해야 합니다:

pip install aiohttp

그런 다음 비동기 웹 요청을 수행하는 예제를 작성합니다:

import asyncio
import aiohttp

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    url = "https://api.github.com"
    response_text = await fetch(url)
    print(response_text)

asyncio.run(main())

위 코드에서는 aiohttp.ClientSession()을 사용하여 비동기 HTTP 클라이언트 세션을 생성하고, session.get()을 사용하여 비동기 GET 요청을 보냅니다. await 키워드를 사용하여 요청이 완료되길 기다립니다.

비동기 프로그래밍을 사용하여 웹 소켓, 데이터베이스 연결 등의 작업도 처리할 수 있습니다. 예를 들어, aiomysql 라이브러리를 사용하여 MySQL 데이터베이스와 비동기로 상호 작용할 수 있습니다.

비동기 프로그래밍은 또한 asyncio.Queue와 같은 동시성 제어 기능을 제공합니다. 이를 사용하여 작업자와 작업 큐를 관리하거나, 세마포어(semaphore)를 사용하여 동시 실행되는 작업 수를 제한할 수 있습니다.

비동기 프로그래밍의 주요 장점은 작업의 완료를 기다리는 동안 다른 작업을 수행하여 전체 애플리케이션의 성능을 향상시키는 데 있습니다. 그러나 복잡한 애플리케이션에서는 비동기 코드의 가독성과 유지 관리가 어려울 수 있으므로, 적절한 상황에서만 사용하는 것이 좋습니다.

728x90

'Python for Beginners' 카테고리의 다른 글

12.2 Tkinter 위젯  (0) 2023.04.04
12.1 Tkinter 소개  (0) 2023.04.04
11.2 멀티스레딩 및 멀티프로세싱  (0) 2023.04.01
11.1 소켓 프로그래밍  (0) 2023.04.01
10.3 ORM(Object-Relational Mapping)  (0) 2023.03.31
Comments