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번으로 가져가고, 상황에 따라서 바꾸면 될 거 같다 !
그럼 난 다음 글로 돌아오겠다 ! 안녕!