Celery를 활용한 비동기 이미지 처리

Celery

이미지 처리는 웹 애플리케이션에서 자주 사용되는 기능 중 하나입니다. 사용자에게 이미지를 보여주는 동안 서버는 이미지를 처리하고 저장하는 작업을 수행해야 합니다. 이런 작업은 시간이 많이 소요되기 때문에 비동기 처리를 통해 웹 애플리케이션의 성능을 향상시킬 수 있습니다.

Celery는 파이썬을 위한 분산 작업 처리 라이브러리로, 비동기 작업을 실행하고 관리할 수 있게 해줍니다. Celery를 사용하여 이미지 처리 작업을 비동기적으로 실행하면 클라이언트는 이미지를 기다리는 동안 다른 작업을 수행할 수 있습니다.

Celery 설정

먼저, Celery를 설치해야 합니다. 아래의 명령을 사용하여 필요한 패키지를 설치할 수 있습니다.

pip install celery

Celery를 사용하기 위해 먼저 Celery 애플리케이션을 설정해야 합니다. celery.py 파일을 생성하고 다음과 같이 설정합니다.

from celery import Celery

app = Celery('image_processing', broker='amqp://localhost')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

위의 예제에서는 image_processing이라는 Celery 애플리케이션을 생성하고, RabbitMQ와의 연결을 설정하였습니다. 필요에 따라 브로커와 연결 설정을 변경할 수 있습니다.

Celery 작업 정의

Celery에서 작업은 함수로 정의됩니다. 예를 들어, 이미지를 리사이즈하는 작업을 정의하려면 다음과 같이 함수를 작성합니다.

from PIL import Image

@app.task
def resize_image(image_path, width, height):
    image = Image.open(image_path)
    resized_image = image.resize((width, height))
    resized_image.save(f'resized_{image_path}')

@app.task 데코레이터를 사용하여 해당 함수가 Celery 작업임을 명시합니다. 위의 예제에서는 PIL 라이브러리를 사용하여 이미지를 리사이즈하고 저장하는 작업을 정의하였습니다.

Celery 작업 실행

Celery 작업은 Celery 애플리케이션을 실행하여 수행할 수 있습니다. 아래의 명령을 사용하여 Celery 애플리케이션을 실행합니다.

celery -A image_processing worker --loglevel=info

위의 예제 명령에서 -A 옵션은 Celery 애플리케이션을 지정하고, worker는 작업자 프로세스를 실행하라는 의미입니다. --loglevel 옵션은 로그 레벨을 지정합니다.

Celery 작업 호출

Celery 작업은 웹 애플리케이션 내에서 호출될 수 있습니다. 예를 들어, Django에서 Celery를 사용하여 이미지 리사이즈 작업을 비동기적으로 실행하려면 다음과 같이 코드를 작성할 수 있습니다.

from image_processing.tasks import resize_image

def process_image(request):
    # 이미지 처리 작업을 할 수 있는 데이터 추출
    image_path = request.FILES['image'].path
    width = request.POST.get('width')
    height = request.POST.get('height')

    # Celery 작업 호출
    resize_image.delay(image_path, width, height)

    # 처리 완료 후 사용자에게 응답
    return HttpResponse('이미지 처리 작업이 예약되었습니다.')

위의 예제에서는 resize_image 작업을 delay 메서드를 사용하여 호출하고 있습니다. 이렇게 하면 이미지 처리 작업이 비동기적으로 예약되어 바로 응답이 가능합니다.

결론

Celery를 활용하여 비동기 이미지 처리를 구현할 수 있습니다. 이를 통해 웹 애플리케이션의 성능을 향상시킬 수 있으며, 사용자 경험을 개선할 수 있습니다. Celery의 강력한 기능을 활용하여 다양한 작업을 비동기적으로 실행할 수 있으니 참고해보세요.

#Celery #비동기처리