DRF & Django

[DRF] Redis, Celery 기본 세팅

UnoCoding 2022. 2. 1. 20:27

Init install pip

# pip install redis

# pip

세팅 폴더에 작성

## backend/celery.py
import os

from celery import Celery

# Celery 모듈을 위한 Django 기본세팅
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings.dev')

# Celery 세팅(borker 설정)
app = Celery('backend',backend='redis://', broker='redis://{rdis ip address}')

# 여기서 문자열을 사용하는것은 작업자가가 자식 프로세스 직렬화 구성을 하지 않는것을 의미합니다.
# -namespace='CELERY' 의 의미는 셀러리와 관련된 모든 설정은 CELERY_ 라는 prefix로 시작함을 의미
app.config_from_object('django.conf:settings', namespace='CELERY')

# Django 에 등록된 모든 task 모듈을 로드합니다.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print("Request: {0!r}".format(self.request))

 

Add : config/__init__.py 

# 이렇게 설정해주면 Django가 시작할떄 Celery가 항상 import 되고
# shared_task 데코레이션이 Celery를 이용하게됩니다.
from .celery import app as celery_app

__all__ = ('celery_app',)

 

FIX config/settings.py

#Redis Setting
BROKER_URL = 'redis://{redis ip address}'
CELERY_RESULT_BACKEND = 'redis://{redis ip address}'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

 

Task파일 샘플 구조

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

 

Task파일 샘플 소스코드

# Create your tasks here
from celery import shared_task
from demoapp.models import Widget


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)


@shared_task
def count_widgets():
    return Widget.objects.count()


@shared_task
def rename_widget(widget_id, name):
    w = Widget.objects.get(id=widget_id)
    w.name = name
    w.save()

@shared_tesk 데코레이터를 통해 외부에서 연결시 import 생략 가능

 

개발 디버그 용으로 실행

celery -A backend worker -l 로그레벨

$ celery -A config worker -l INFO

 

백앤드 모드 실행

# start(work name, projdect name)
celery multi start {w1} -A {backend} -l INFO

# restart
celery  multi restart {w1} -A {backend} -l INFO

# stop or wait stop
celery multi stop {w1} -A {backend} -l INFO
celery multi stopwait {w1} -A {backend} -l INFO

 

그냥 백앤드 실행 하면 권한 문제로 안된다. (클라우드)

# 해당 코드는 project 폴더에서 실행 해야함

celery multi restart worker1 \
    -A backend \
    --pidfile="$HOME/run/celery/%n.pid" \
    --logfile="$HOME/log/celery/%n.log" \
    -l INFO

celery multi start worker1 \
    -A backend \
    --pidfile="$HOME/run/celery/%n.pid" \
    --logfile="$HOME/log/celery/%n.log" \
    -l INFO

celery multi stopwait worker1 \
    -A backend \
    --pidfile="$HOME/run/celery/%n.pid" \
    --logfile="$HOME/log/celery/%n.log" \
    -l INFO

마지막 TIP (로그 파일 보는 명령어)

tail -f worker.log

 

'DRF & Django' 카테고리의 다른 글

[Django] Django에서 쓰이는 Context Manager  (0) 2023.01.31
[DRF] Serializers 개념  (0) 2022.08.08
[DRF] ORM 중복 제거  (0) 2022.03.10
[DRF] Redis vs RabbitMQ and setting  (0) 2022.02.03