Celery를 이용한 실시간 이미지 처리

이미지 처리는 많은 웹 어플리케이션에서 필수적인 작업 중 하나입니다. 특히 사용자가 업로드한 이미지를 실시간으로 처리해야 하는 경우에는 성능과 사용자 경험에 큰 영향을 미칩니다. 이 글에서는 Celery를 이용하여 실시간 이미지 처리를 구현하는 방법을 알아보겠습니다.

Celery란?

Celery는 Python에서 비동기 작업을 처리하기 위한 분산 처리 프레임워크입니다. 이를 통해 CPU 집약적인 작업이나 네트워크를 통한 비동기 처리와 같은 작업을 손쉽게 처리할 수 있습니다. Celery는 Redis나 RabbitMQ와 같은 메시지 브로커와 함께 사용하여 작업 큐를 구성하고, 작업자(worker) 프로세스가 이 큐에서 작업을 가져와 처리함으로써 비동기 작업을 구현합니다.

이미지 처리 작업을 Celery로 분리하기

Celery를 사용하여 이미지 처리 작업을 분리하는 방법은 다음과 같습니다.

  1. Celery와 Redis 또는 RabbitMQ를 설치합니다. 이 글에서는 Redis를 예시로 설명합니다.
  2. Celery 프로젝트를 생성하고 Celery 설정을 설정합니다.
  3. 이미지 처리 함수를 작성하고 @celery.task 데코레이터를 붙여 Celery 작업으로 등록합니다.
  4. 웹 어플리케이션에서 이미지를 업로드하는 API를 작성합니다.
  5. 업로드된 이미지를 Celery 작업으로 처리하도록 설정합니다.

1. Celery와 Redis 설치하기

pip install Celery
pip install redis

2. Celery 프로젝트 생성 및 설정

celery.py 파일을 생성하고 다음과 같이 Celery 설정을 작성합니다.

from celery import Celery

# Celery 설정
app = Celery('image_processing', broker='redis://localhost:6379/0')

# Celery 태스크를 찾을 모듈 설정
app.autodiscover_tasks(['your_app'])

3. 이미지 처리 함수 작성하기

아래는 이미지를 흑백으로 변환하는 예시입니다.

from PIL import Image

@celery.task
def process_image(filename):
    image = Image.open(filename)
    processed_image = image.convert('L')

    processed_filename = f'processed_{filename}'
    processed_image.save(processed_filename)

    return processed_filename

4. 이미지 업로드 API 작성하기

웹 어플리케이션에서 이미지를 업로드하는 API 코드 예시입니다.

from flask import Flask, request

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_image():
    file = request.files['image']
    file.save('temp.jpg')  # 임시 파일로 저장

    # 이미지 처리 작업을 Celery 작업으로 등록
    process_image.delay('temp.jpg')

    return 'Image uploaded and processing started'

5. 이미지 처리 작업 실행하기

Celery를 실행하고 이미지 처리 작업을 처리합니다.

celery -A celery_app worker --loglevel=info

이제 이미지가 업로드되면 Celery가 백그라운드에서 이미지 처리 작업을 수행하게 됩니다.

결론

Celery를 사용하여 이미지 처리 작업을 비동기로 처리하는 방법을 알아보았습니다. 이를 통해 웹 어플리케이션의 성능과 사용자 경험을 향상시킬 수 있습니다.

#이미지처리 #비동기처리