무작정 Celery 써보기

2024. 11. 6. 14:45카테고리 없음

장고 프로젝트는 당연히 설치가 되어있어야 하겠죠 ? 

ㄴ 네네.. 빨리 시작이나 하셈요

 

 

1. Celery 설치하기

pip install celery

셀러리 설치해주고

 

pip install django-celery-beat

스케줄러 역할을 하는 비트도 설치해주자! (비트를 통해 작업을 예약할 수 있음)

 

2. Celery.py 만들기

- 간단 설명 ~ 이 파일은 셀러리를 쓰기 위한 환경 설정을 하는 파일임! ~

위치는 ? settings.py 가 있는 곳! 

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

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트 이름.settings')
app = Celery('프로젝트 이름')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

3. init.py 작성하기

- 간단 설명 ~ 장고가 시작될 때 셀러리 앱이 함께 로드 되기 위해 적어주는 파일 ~ 

-> 이걸 안 할시, 셀러리 앱이 로드가 안 될 수도 있고 그럼? 등록된 작업들을 인식하지 못 해 오류가 발생할 수 있다.

- 위치는? celery.py 가 있는 곳에 init.py

from .celery import app as celery_app

__all__ = ('celery_app',)

그대로 복붙하시면 됩니다!

4. task.py 만들기

- 간단 설명 ~ 이 파일은 셀러리한테 시킬 작업을 적는 곳 ~

위치는 ? 내가 원하는 앱 안에! (만약 채팅에서 셀러리를 쓰고 싶었다면, 채팅 앱 안에 만들면 되겠죠?)

from celery import shared_task
from .models import Message

@shared_task
def clear_chat_and_update_topic():
    Message.objects.all().delete()

 

만약 일정시간 마다 DB를 삭제하고 싶다면 ?

- 함수 하나 만들어서 로직 작성하기

- @shared_task는 꼭 붙여줘야함

  • 왜?
    • @shared_task는 함수를 Celery 작업으로 변환하여, 이를 Celery 워커가 독립적으로 실행할 수 있게 하는 역할임.
    • @app.task를 쓸 수도 있지만, 특정 Celery 애플리케이션 인스턴스(app)에 종속된 작업만을 정의해서 재사용성이 좋지 않음.
    • 어려우면? 걍 @shared_task 쓰면 됨!

 

5. settings.py 설정해주기

settings.py 엔 4가지를 적어주어야 한다! 

- Installed_apps 에 추가해줄 것

    - 'django-celery-beat', 'celery',

- 브로커

- 작업 결과를 저장할 백엔드

- 셀러리 비트 (스케줄러임, 작업을 예약할 수도 있음!)

INSTALLED_APPS = [
	#생략....
	
    'celery',
    'django_celery_beat',
]


#브로커
CELERY_BROKER_URL = 'redis://redis:6379/0'

#결과 저장할 백엔드
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'

#셀러리 비트
CELERY_BEAT_SCHEDULE = { 
    'clear_chat_and_update_topic': {
        'task': 'chat.tasks.clear_chat_and_update_topic', #task.py 에 만들어놨던 작업불러오기
        'schedule': crontab(hour=0, minute=0), #언제 실행될지 시간 예약하기
    },
}

브로커와 벡엔드는 redis로 통일해주었다!

다른 걸로도 할 수 있지만.. 프로젝트가 무겁지 않고 저걸로 충분히 돌아갈 거 같아서! 

 

 

 

이렇게 하면 끝이다! 

뭔가 많이 빠진 것 같지만,, 최대한 간단하게 적으려고 노력했다 ! 

일단 기본적으로 파일 적는 건 1-5번으로 가져가고, 상황에 따라서 바꾸면 될 거 같다 ! 

그럼 난 다음 글로 돌아오겠다 ! 안녕!