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 |