본문 바로가기
Programming/Python

Python에서의 비동기 프로그래밍

by BTC_박현영 2023. 10. 12.

베하~ 안녕하세요! 현상수배범입니다. 오늘은 Python에서의 비동기 프로그래밍에 대해 알아보도록 하겠습니다.

 

비동기 프로그래밍은 현대 소프트웨어 개발에서 중요한 개념 중 하나입니다. 특히 I/O 바운드 작업, 예를 들어 API 요청, 파일 입출력 등에서 비동기 처리는 프로그램의 효율성을 크게 높일 수 있습니다. Python에서는 asyncio 라이브러리를 통해 비동기 프로그래밍을 쉽게 구현할 수 있습니다. 본 글에서는 Python의 asyncio와 aiohttp 라이브러리를 사용하여 비동기 프로그래밍을 어떻게 구현하는지 자세히 알아보겠습니다.

 

비동기 프로그래밍이란?

비동기 프로그래밍은 말 그대로 '비동기적'으로 동작하는 코드를 작성하는 것을 의미합니다. 이는 프로그램의 여러 부분이 독립적으로, 또는 병렬로 실행될 수 있게 해줍니다. 그렇다면 이러한 비동기 프로그래밍이 왜 필요한 것일까요? 그리고 이것이 I/O 작업에 어떤 이점을 가지는지 살펴보겠습니다.

동기 프로그래밍의 한계

동기 프로그래밍에서는 코드가 작성된 순서대로 한 단계씩 실행됩니다. 이는 간단한 작업에서는 문제가 되지 않지만, 예를 들어 네트워크 요청, 파일 읽기/쓰기와 같은 I/O 작업에서는 문제가 될 수 있습니다.

이러한 I/O 작업은 대개 시간이 오래 걸리며, 동기적으로 코드를 작성할 경우 해당 작업이 완료될 때까지 다음 작업은 대기 상태에 머무르게 됩니다. 이로 인해 프로그램의 전체적인 성능과 반응성이 저하될 수 있습니다.

비동기 프로그래밍의 이점

비동기 프로그래밍은 이러한 문제를 해결하기 위한 방법 중 하나입니다. 비동기 코드에서는 I/O 작업을 시작한 뒤, 그 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있습니다.

예를 들어, 여러 개의 파일을 동시에 다운로드해야 하는 상황을 생각해보겠습니다. 동기 코드에서는 파일 하나를 다운로드하는 동안 다른 모든 작업은 대기 상태에 있어야 합니다. 반면에 비동기 코드에서는 여러 파일을 동시에 다운로드할 수 있으므로, 전체 작업 시간이 크게 단축됩니다. (실제로는 다운로드 속도에는 네트워크 전송 속도, IOPS 등 다양한 원인이 존재할 수 있으나, 위 내용은 단순 예시로 작성했습니다.)

I/O 작업과 비동기 프로그래밍

I/O 작업은 대체로 '대기 시간'이 긴 작업입니다. 예를 들어, 웹 서버에 데이터를 요청하고 응답을 받을 때까지의 시간, 디스크에서 큰 파일을 읽어 들이는 시간 등이 이에 해당합니다. 이러한 대기 시간 동안 CPU는 실제로는 아무런 작업을 하지 않고 대기 상태에 머무릅니다.

비동기 프로그래밍은 이러한 '대기 시간'을 활용하여 다른 작업을 수행할 수 있게 해줍니다. 즉, 한 작업이 대기 상태에 있을 때 다른 작업을 실행함으로써, 전체적인 프로그램의 효율성과 성능을 높일 수 있습니다.

비동기 프로그래밍은 특히 I/O 바운드 작업에서 많은 이점을 가집니다. 이는 대기 시간을 효율적으로 활용하여 프로그램의 성능을 향상시키기 때문입니다. 이러한 비동기 처리는 Python의 asyncio 라이브러리를 통해 쉽게 구현할 수 있으며, 이를 활용하면 더 빠르고 효율적인 프로그램을 작성할 수 있습니다.

 

 

asyncio

Python 3.5 이상에서는 async와 await 키워드를 통해 비동기 작업을 쉽게 처리할 수 있습니다. asyncio 라이브러리는 이러한 비동기 작업을 더 편리하게 만들어 줍니다.

 

기본 예제

import asyncio

async def main():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

asyncio.run(main())

 

 

aiohttp: 비동기 HTTP 요청

aiohttp는 asyncio를 활용해 비동기 방식으로 HTTP 요청을 처리할 수 있는 라이브러리입니다.

 

기본 예제

import aiohttp
import asyncio

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, 'http://example.com')
        print(html)

asyncio.run(main())

 

 

비동기 웹 스크래핑

비동기 프로그래밍을 활용하면 웹 스크래핑 작업도 효율적으로 수행할 수 있습니다. 예를 들어, 여러 페이지의 데이터를 동시에 요청하여 처리할 수 있습니다.

예제 코드

import aiohttp
import asyncio

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

async def main():
    urls = ['http://example.com/page1', 'http://example.com/page2']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_page(session, url) for url in urls]
        pages = await asyncio.gather(*tasks)
        print(pages)

asyncio.run(main())

 

비동기 프로그래밍은 Python에서도 강력한 도구로 자리 잡고 있습니다. 특히 asyncio와 aiohttp 라이브러리를 활용하면 이러한 비동기 작업을 더욱 간편하고 효과적으로 수행할 수 있습니다. 이를 통해 I/O 바운드 작업의 성능을 크게 향상시킬 수 있으며, 복잡한 웹 서비스나 애플리케이션에서도 높은 처리 능력을 보일 수 있습니다.

 

 

Python 공식 문서: asyncio — Asynchronous I/O
aiohttp 공식 문서: aiohttp Documentation

댓글