JustDoEat
Django Celery 기본설정 본문
셀러리란?
분산작업 처리를 위한 비동기 작업 큐 라이브러리이다,
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)