JustDoEat

Django Celery 기본설정 본문

카테고리 없음

Django Celery 기본설정

kingmusung 2024. 1. 20. 02:11

셀러리란?

분산작업 처리를 위한 비동기 작업 큐  라이브러리이다, 

1. 비동기 작업에 쓰임 (지금 프로젝트에서는 달리를 이용한 이미지 생성이 오래 걸리므로 비동기로 실행하기 위함임)

2.작업스케줄링에 쓰임, 예약된 작업을 스케줄링 할 수 있다.(diary의 만료여부를 매일 00시에 변경하도록 설정)

 

# settings.py

# celery와 관련된 환경설정 아래 적어주면 됌
CELERY_BROKER_URL = 'amqp://guest:guest@rabbitmq:5672//'
CELERY_RESULT_BACKEND = 'rpc://'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Seoul'
CELERY_ENABLE_UTC = False

위에 나열된 설정은 Celery라는 분산 작업 큐를 설정하는 데 사용되는 환경 변수입니다. Celery는 비동기 작업을 처리하고 큐에서 작업을 실행하는 분산 작업 큐 시스템입니다. 각 설정의 역할은 다음과 같습니다: 

CELERY_BROKER_URL = 'pyamqp://guest:guest@localhost:5672//

'메시지 브로커의 URL을 지정합니다. 셀러리는 단독으로 사용이 불가능하고 rabbitmq나 redis 같은 메시지 큐들이 있어야함.

->메시지 브로커는 작업을 프로듀서에서 큐로 전송하고, 컨슈머에서 큐로부터 작업을 가져오는 역할을 함

 

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0':

작업의 결과를 저장하는 백엔드를 설정합니다. 여기서는 RPC (Remote Procedure Call) 백엔드를 사용하고 있습니다. 작업이 완료되면 결과는 RPC 백엔드에 저장되는데.작업의 상태 및 결과를 추적할 수 있다.

 

잠깐 여기서 RPC Backend란?

아래코드는 하루프로잭트중 비동기로 달리모델을 이용하여 스티커를 생성하는 코드이다

def generate_sticker_images(keywords):

    sticker_image_urls = {}

    tasks = []
    for keyword in keywords:
        task = generate_sticker_image.delay(keyword)
        tasks.append((keyword, task))

    for keyword, task in tasks:

        result = task.get()  # 대기하면서 결과 가져오기

        response = requests.get(result)
        image_data = response.content
        output_data = remove_background.delay(image_data).get()

        sticker_image_urls[keyword] = output_data

    return sticker_image_urls
   result = task.get()  # 대기하면서 결과 가져오기​

다른 글에서 코드에대한 설명을 적어놓았으니 생략을하고.

task가 실행이 완료가 되면 RPC에 저장이 되는것이고 그 결과를 .get()을 통해 가지고 와야한다.

task의 결과가  RPC에 저장이 되는것이다!

 

CELERY_ACCEPT_CONTENT = ['application/json']

Celery 워커가 수락할 수 있는 컨텐츠 유형을 지정합니다. 여기서는 JSON 형식의 메시지를 수락하도록 설정되어 있습니다.

 

CELERY_TASK_SERIALIZER= 'json' 

작업에 사용되는 직렬화 방식을 설정합니다. 여기서는 작업을 JSON 형식으로 직렬화하도록 설정되어 있습니다. CELERY_RESULT_SERIALIZER: 작업 결과에 사용되는 직렬화 방식을 설정합니다. 작업 결과를 RPC 백엔드에 저장할 때 사용되는 직렬화 방식입니다.

 

CELERY_TIMEZONE = 'Asia/Seoul'

 Celery 작업의 시간대를 설정합니다. 여기서는 Asia/Seoul로 설정되어 있어 한국 시간대를 사용합니다. CELERY_ENABLE_UTC: Celery가 UTC 시간을 사용할지 여부를 설정합니다. 여기서는 False로 설정되어 있어서 UTC를 사용하지 않고, CELERY_TIMEZONE에 설정된 시간대를 사용합니다.

#config안 init파일임
# __init__.py

from __future__ import absolute_import, unicode_literals

# Celery 앱 생성
from .celery import app as celery_app

__all__ = ('celery_app',)
# celery.py, config안에 있어야함

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# 'config'는 Django 설정 파일의 모듈 경로입니다.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

# Celery 앱 생성
app = Celery('config')

# Django 설정으로부터 Celery 설정을 가져옵니다.
app.config_from_object('django.conf:settings', namespace='CELERY')

# 등록된 Django 앱 설정에서 task를 자동으로 불러옵니다.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)