본문 바로가기
Django/Celery

Django에 Celery 적용하기 첫번째

by 붕어사랑 티스토리 2021. 2. 28.
반응형

https://docs.celeryproject.org/en/stable/django/first-steps-with-django.html

해당 게시물은 위 주소의 사이트의 내용을 기반으로 합니다. 일부 영양가 없는 내용은 제외되었습니다.

 

 

 

 

Django에 Celery 적용하기 첫번째

Celery를 Django에 쓰려면 먼저 Celery 라이브러리 Instance를 정의해야 합니다!

장고에서는 이를 app이라 부르죠.

 

 

장고 프로젝트 구조가 아래와 같다고 합시다.

- proj/
    - manage.py
    - config/
        - __init__.py
        - settings.py
        - urls.py

 

그러면 proj/config/celery.py 에 Celery Instance를 만들어줍시다!

 

file : proj/config/celery.py

import os

from celery import Celery

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

app = Celery('config')


# 여기서 문자열을 사용하는것은 작업자가가 자식 프로세스 직렬화 구성을 하지 않는것을 의미합니다.
# -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(f'Request: {self.request!r}')

이후 proj/config/__init__.py 에 Celery 앱을 로드해주어야 합니다.

 

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

__all__ = ('celery_app',)

 

 

 

상기 과정을 세세하게 분석해볼게용

첫째로 여러분은 Celery를 위해 DJANGO_SETTINGS_MODULE 로 기본환경 세팅을 하셨습니다

 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

 

사실 위 내용은 필요없습니다만 여러분이 Celery 세팅을 하는데 많은 시간을 절약해줍니다.

아래와 같이 Celery 앱을 만들기 전에 반드시 미리 선언해야 합니다.

 

app = Celery('config')

 

app은 우리가 선언한 Celery 인스턴스가 되겠군요.

 

app.config_from_object('django.conf:settings', namespace='CELERY')

 

 

상기와 같이 Django 세팅을 Celery 구성으로 설정합니다.

 

여기서 대문자로 네임스페이스 부여한 의미는 Celery 관련된 설정이 반드시 CELERY_로 시작하며, 대문자로 와야 함을 의미합니다.

예를들어 task_always_eager 설정은 CELERY_TASK_ALWAYS_EAGER 가 되어야 하죠.

(CELERY 네임스페이스는 option이고 원하시는대로 바꾸셔도 됩니다.)

 

 

 

예시

# settings.py
# Celery Configuration Options
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

 

 

 

 

Celery는 일반적으로 task들을 app폴더 밑에 tasks.py 에 정의하는게 원칙입니다.

그리고 하기위 같은 코드로 Celery는 자동으로 task들을 찾아냅니다.

 

app.autodiscover_tasks()

 

아래는 상기내용을 구성한 예시입니다.

 

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

 

 

이러한 방법을 사용하면 직접 CELERY_IMPORTS 세팅을 사용할 필요가 없어집니다.

이제 어느정도 감이 잡히셨나요?

 

 

 

다음으로 shared_task 데코레이터 사용법으로 넘어가겠습니다.

 

장고에서 app은 프로젝트에 종속되지 않고 끼웠다 뺏다 할 수 있지요.

Celery 또한 이러한 형태로 직접적으로 import 하지 않고 끼웠다 뺏다 할 수 있도록

shared_task 데코레이터를 제공합니다.

하기는 tasks.py에 shared_task 데코레이터를 사용한 예시입니다.

 

 

 

demoapp/tasks.py


# 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()

 

 

 

자 이제 마지막으로 Celery를 실행 해 봅시다!

Celery를 실행하는 방법은 2가지가 있습니다.

 

1. 배포용으로 Deamon으로 실행하는법

 

Deamon으로 실행하고 싶으실 경우 하기 링크를 참조해 주세요.

https://docs.celeryproject.org/en/stable/userguide/daemonizing.html#daemonizing

 

 

 

2. 개발과 디버깅을 위한 방법으로 실행하는법

 

Django에서 python manage.py runserver 처럼 개발용으로 서버를 실행하시고 싶으면 아래와 같이

celery worker로 실행해 주시면 되겠습니다.

 

 

celery -A 앱이름 worker -l 로그레벨

위의 예시에서는 아래와 같이 입력하면 되겠군요.

 

$ celery -A config worker -l INFO

 

 

 

 

 

아마 실행해보면 

[2021-02-28 12:29:16,082: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.

 

이런 에러가 뜰겁니다. 구글링 해보면 broker url 문제라고 나옵니다. 이 글에서는 broker를 설정하지 않았지요. 브로커 서버를 실행하지도 않았고요. 다음 강의로 넘어갑시다.

반응형

'Django > Celery' 카테고리의 다른 글

Celery beat으로 주기적으로 tasks 수행하기  (0) 2021.03.16
Django에서 Celery 이용하기 두번째  (0) 2021.02.28

댓글