Celery를 활용한 비동기 이미지 다운로드

이미지 다운로드는 웹 애플리케이션에서 매우 중요한 기능 중 하나입니다. 그러나 이미지 다운로드 작업은 많은 시간과 리소스를 소모할 수 있기 때문에, 이를 비동기적으로 처리하는 것이 좋습니다. 이를 위해 Celery를 사용하여 이미지 다운로드 작업을 비동기적으로 처리해보겠습니다.

Celery란?

Celery는 Python에서 분산 작업 큐 및 작업 스케줄링을 위한 오픈소스 라이브러리입니다. 분산 시스템에서 비동기 작업을 처리할 때 매우 유용한 도구입니다.

Celery 설치 및 설정

Celery를 사용하기 위해 먼저 설치해야 합니다. 다음 명령어를 사용하여 Celery를 설치합니다.

pip install celery

Celery를 사용하기 위해 celery.py라는 파일을 생성하고 다음과 같이 설정합니다.

from celery import Celery

app = Celery('image_download', broker='amqp://guest@localhost//', backend='rpc://')

@app.task
def download_image(url):
    # 이미지 다운로드 작업 수행
    ...

위의 코드에서 broker는 Celery가 메시지 브로커(RabbitMQ나 Redis)와 통신하는 데 사용하는 URL입니다. backend은 결과를 저장하는 데 사용됩니다.

이미지 다운로드 작업 정의

이제 이미지 다운로드 작업을 정의해보겠습니다. download_image() 함수는 이미지의 URL을 입력받아 이미지를 다운로드하는 작업을 수행합니다. 다음은 간단한 예시입니다.

import urllib.request

@app.task
def download_image(url):
    urllib.request.urlretrieve(url, 'downloaded_image.jpg')
    return 'downloaded_image.jpg'

urlretrieve() 함수를 사용하여 주어진 URL에서 이미지를 다운로드합니다. 다운로드한 이미지를 downloaded_image.jpg로 저장한 후, 해당 파일 이름을 반환합니다.

작업 전송 및 결과 확인

이제 이미지 다운로드 작업을 Celery에게 전송하고 결과를 확인해보겠습니다. 다음과 같이 코드를 작성합니다.

from celery import chord

image_urls = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    'https://example.com/image3.jpg'
]

# 이미지 다운로드 작업을 병렬로 실행
download_task = chord([download_image.s(url) for url in image_urls])
result = download_task.apply_async()

# 작업 결과 확인
downloaded_images = result.get()
print(downloaded_images)

chord() 함수를 사용하여 여러 이미지 다운로드 작업을 병렬로 실행합니다. download_image.s(url)download_image 작업을 celery에게 전송하는 역할을 합니다. apply_async() 함수를 사용하여 작업을 비동기적으로 실행하고 결과를 얻습니다.

결론

Celery는 이미지 다운로드와 같은 비동기 작업을 처리하기 위한 효과적인 방법을 제공합니다. 이를 사용하면 애플리케이션의 성능과 사용자 경험을 향상시킬 수 있습니다. Celery의 유연성과 강력한 기능을 활용하여 비동기 작업을 보다 효율적으로 처리할 수 있습니다.

#python #Celery