본문 바로가기
Python

[Python] download with asyncio

by bryan.oh 2023. 1. 24.
반응형

Python은 비동기 작업을 처리하기 위한 훌륭한 언어이며 이 목적을 위한 가장 인기 있는 라이브러리 중 하나는 asyncio입니다. 

이번 포스트에서는 asyncio를 사용하여 Python의 URL에서 이미지를 다운로드하는 방법을 살펴보겠습니다.

먼저 필요한 라이브러리를 가져오는 것으로 시작하겠습니다

import asyncio
import aiohttp

aiohttp 라이브러리는 Python용 비동기 HTTP 클라이언트입니다. 이 라이브러리를 사용하여 URL에서 이미지를 다운로드합니다.

 

다음으로 이미지 다운로드를 처리할 함수를 정의해 보겠습니다. 이 예에서는 이 함수를 download_image()라고 합니다. 이 함수는 이미지의 URL을 매개변수로 사용하고 이미지 데이터를 바이트 객체로 반환합니다.

async def download_image(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            if response.status == 200:
                return await response.read()
            else:
                return None

이 함수에서는 aiohttp 세션을 생성하고 이를 사용하여 이미지 URL에 GET 요청을 합니다. 응답 상태가 200(OK)이면 응답에서 이미지 데이터를 읽고 바이트열 객체로 반환합니다. 응답 상태가 200이 아니면 None을 반환합니다.

 

이제 모든 것을 모아서 이미지를 다운로드할 기본 기능을 만들어 보겠습니다. 이 함수는 download_image() 함수를 호출하고 이미지 데이터를 파일에 저장합니다.

async def main():
    url = "https://images.pexels.com/photos/305070/pexels-photo-305070.jpeg"
    image_data = await download_image(url)
    if image_data:
        with open("image.jpg", "wb") as f:
            f.write(image_data)
        print("Image saved successfully!")
    else:
        print("Error downloading image.")

이 예제에서 main 함수는 샘플 이미지의 URL을 사용하고 download_image() 함수를 호출하여 이미지를 다운로드합니다. 이미지 데이터가 반환되면 "image.jpg"라는 파일에 저장됩니다. 이미지 데이터가 반환되지 않으면 오류 메시지가 출력됩니다.

 

마지막으로 asyncio 이벤트 루프를 사용하여 main() 함수를 실행해야 합니다.

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

asyncio를 사용하면 비동기 방식으로 URL에서 이미지를 다운로드할 수 있습니다. 즉, 이미지를 다운로드하는 동안 프로그램이 다른 작업을 계속 실행할 수 있습니다.

 

또한 asyncio를 사용하여 여러 이미지를 동시에 다운로드할 수 있으며, gather 기능을 사용하여 여러 코루틴을 동시에 실행할 수 있습니다.

이는 기본적인 예일 뿐이며 오류 사례 처리 및 진행률 표시줄 추가와 같은 특정 요구 사항에 맞게 조정해야 할 수도 있습니다.

결론적으로 Asyncio는 Python에서 동시 작업을 처리하는 훌륭한 방법이며 Python 애플리케이션을 더 효율적이고 빠르게 만드는 데 도움이 되는 강력한 도구입니다. asyncio를 사용하여 이미지를 다운로드하는 것은 훌륭한 사용 사례이며 애플리케이션의 응답성과 속도를 높이는 데 도움이 될 수 있습니다.

728x90
반응형

댓글