Asyncio는 Python 3.5부터 내장된 비동기 프로그래밍을 위한 라이브러리입니다.

 

이 라이브러리는 비동기 방식으로 여러 작업을 동시에 처리할 수 있도록 지원합니다.

 

동기 프로그래밍에서는 작업이 순차적으로 처리되지만, 비동기 프로그래밍에서는 여러 작업이 동시에 진행될 수 있습니다.

 

Asyncio는 주로 이벤트 루프와 코루틴을 기반으로 작동합니다.

 

이벤트 루프는 작업들을 순차적으로 실행시키는 역할을 하며, 코루틴은 asyncio의 기본 실행 단위입니다.

 

코루틴은 함수와 유사하지만, async 및 await 키워드를 사용하여 비동기 작업을 정의하고 실행할 수 있습니다.

 

 

Asyncio를 사용하는 방법

Asyncio를 사용하는 방법은 다음과 같습니다:

  1. 이벤트 루프 생성
  • 이벤트 루프는 비동기 작업을 관리하는 핵심 요소입니다. 이벤트 루프를 생성하기 위해 asyncio 모듈의 get_event_loop() 함수를 사용하거나 asyncio.run() 함수를 사용할 수 있습니다.
import asyncio

# asyncio.run()을 사용하여 이벤트 루프 실행
async def main():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

asyncio.run(main())

 

 

  1. 비동기 작업 정의
  • 비동기 작업은 코루틴으로 정의됩니다. 코루틴은 일반 함수와 비슷하지만, 실행을 일시 중단하고 다른 작업을 수행할 수 있는 기능을 가지고 있습니다. 코루틴은 async def 키워드를 사용하여 정의합니다.
import asyncio

async def async_func():
    print('Start')
    await asyncio.sleep(2)
    print('End')

 

 

  1. 비동기 작업 실행
  • 비동기 작업을 실행하기 위해 await 키워드를 사용하여 코루틴을 호출합니다. 여러 코루틴을 동시에 실행하려면 asyncio.create_task()를 사용하여 태스크로 등록할 수 있습니다.
import asyncio

async def main():
    task1 = asyncio.create_task(async_func())
    task2 = asyncio.create_task(async_func())

    await task1
    await task2

asyncio.run(main())

 

 

Asyncio를 사용할 때 주의해야 할 점

Asyncio를 사용할 때 주의해야 할 점은 다음과 같습니다:

  • 이벤트 루프 관리: asyncio는 이벤트 루프를 사용하여 비동기 작업을 처리합니다. 이벤트 루프는 한 번에 하나만 실행될 수 있으며, 이미 실행 중인 이벤트 루프가 있는 경우 asyncio.run()을 호출하면 안 됩니다.
  • 코루틴의 적절한 사용: 코루틴은 비동기 작업을 정의하는 기본 단위입니다. 코루틴을 실행하려면 await 키워드를 사용해야 하며, 여러 코루틴을 동시에 실행하려면 asyncio.create_task()를 사용하여 태스크로 등록해야 합니다.
  • I/O 바운드 작업에 적합: asyncio는 주로 I/O 바운드 작업에 적합합니다. CPU 바운드 작업에서는 asyncio의 이점이 크지 않을 수 있습니다. 따라서 asyncio를 사용할 때는 작업의 특성을 고려해야 합니다.

 

 

Aiohttp 는 뭐고, Asyncio 와의 차이점

Asyncio는 비동기 프로그래밍을 위한 기본 모듈로, 이벤트 루프와 코루틴을 관리하며, I/O 바운드 작업에서 효율적입니다.

 

반면, Aiohttp는 이러한 Asyncio를 기반으로 하여 HTTP 클라이언트 및 서버 기능을 제공하는 라이브러리입니다. 즉, Aiohttp는 Asyncio의 기능을 활용하여 네트워크 관련 작업을 비동기적으로 처리할 수 있도록 도와줍니다.

 

Asyncio는 일반적인 비동기 작업을 관리하는 데 사용되며, Aiohttp는 특히 HTTP 프로토콜을 사용하는 네트워크 작업에 특화되어 있습니다. 따라서 웹 애플리케이션이나 API 서버 개발에 Aiohttp가 더 적합합니다.

 

 

Asyncio와 aiohttp를 함께 사용하는 방법

다음은 aiohttp와 asyncio를 사용하여 비동기적으로 HTTP GET 요청을 보내는 예제입니다.

import asyncio
import aiohttp

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

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://www.example.com')
        print(html)

asyncio.run(main())
  • aiohttp.ClientSession: HTTP 요청을 보내기 위해 세션을 생성합니다. 세션은 여러 요청 간에 연결을 재사용할 수 있어 성능을 향상시킵니다.
  • async with: 비동기 컨텍스트 관리자로, 세션이나 HTTP 요청의 수명 주기를 관리합니다.
  • await: 비동기 작업이 완료될 때까지 기다립니다. session.get()과 같은 비동기 함수 호출에 사용됩니다.
  • 세션 관리: async with 구문을 사용하여 세션을 열고 닫아야 합니다. 이렇게 하면 세션이 자동으로 닫혀 리소스 누수를 방지할 수 있습니다.
  • 비동기 작업 스케줄링: 여러 HTTP 요청을 동시에 보내려면 asyncio.gather()를 사용하여 여러 코루틴을 동시에 실행할 수 있습니다.

'Programming Language > Python' 카테고리의 다른 글

pytest 기본 사용법 정리  (0) 2025.02.07
제너레이터(generator)  (0) 2025.02.07
Jupyter notebook 에서 argparse 를 사용할 때 발생하는 에러  (0) 2024.08.07
yield 에 대해서  (0) 2024.08.06
언패킹 (Unpacking)  (0) 2024.07.10

+ Recent posts