Django-Celery 초급 가이드

2023. 12. 11. 15:39개발/Celery

728x90
반응형

다음과 같은 Django 프로젝트 레이아웃이 있다면:

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

권장되는 방법은 proj/proj/celery.py 모듈을 생성하여 Celery 인스턴스를 정의하는 것입니다:

# file: proj/proj/celery.py
import os
from celery import Celery

# 'celery' 프로그램을 위해 기본 Django 설정 모듈을 설정합니다.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# 여기서 문자열을 사용하는 것은 worker가 구성 객체를 자식 프로세스로 직렬화할 필요가 없다는 의미입니다.
# - namespace='CELERY'는 모든 Celery 관련 구성 키에 `CELERY_` 접두사가 있어야 함을 의미합니다.
app.config_from_object('django.conf:settings', namespace='CELERY')

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

@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

그런 다음 proj/proj/__init__.py 모듈에서 이 앱을 가져와야 합니다. 이렇게 하면 Django가 시작될 때 항상 앱이 로드되어 @shared_task 데코레이터(나중에 언급함)가 이를 사용합니다:

# proj/proj/__init__.py:
# 이렇게 하면 항상 Django가 시작될 때 앱이 가져와져서 shared_task가 이 앱을 사용합니다.
from .celery import app as celery_app

__all__ = ('celery_app',)

먼저 celery 명령행 프로그램에 기본 DJANGO_SETTINGS_MODULE 환경 변수를 설정합니다:

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

이 줄은 필요하지 않지만 항상 설정 모듈을 celery 프로그램에 전달하지 않아도 되도록 도와줍니다. 이것은 항상 앱 인스턴스를 만들기 전에 나와야 합니다. 다음으로 라이브러리의 인스턴스를 만듭니다:

app = Celery('proj')

이것은 라이브러리의 인스턴스입니다.

Django 설정 모듈을 Celery의 구성 소스로 추가합니다. 이는 여러 구성 파일을 사용할 필요가 없음을 의미하며 대신 Django 설정에서 직접 Celery를 구성할 수 있음을 의미합니다. 그러나 필요하다면 구성을 분리할 수도 있습니다.

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

대문자 네임스페이스는 모든 Celery 구성 옵션이 소문자 대신 대문자로 지정되어야 하며 CELERY_로 시작해야 함을 의미합니다. 예를 들어 task_always_eager 설정은 CELERY_TASK_ALWAYS_EAGER가 되고, broker_url 설정은 CELERY_BROKER_URL이 됩니다. 이는 워커 설정에도 적용되며 예를 들어 worker_concurrency 설정은 CELERY_WORKER_CONCURRENCY가 됩니다.

예를 들어 Django 프로젝트의 설정 파일에는 다음이 포함될 수 있습니다:

# settings.py
...

# Celery Configuration Options
CELERY_TIMEZONE = 'Asia/Seoul'
CELERY_TASK_TRACK_STARTED =True
CELERY_TASK_TIME_LIMIT = 30 * 60

설정 개체를 직접 전달할 수도 있지만, 문자열을 사용하는 것이 좋습니다. 이렇게 하면 워커가 객체를 직렬화할 필요가 없기 때문입니다. CELERY_ 네임스페이스는 선택적이지만 권장됩니다(다른 Django 설정과의 중첩을 방지하기 위해).

그 다음으로 재사용 가능한 앱의 일반적인 관행은 모든 작업을 별도의 tasks.py 모듈에 정의하는 것입니다. Celery는 이러한 모듈을 자동으로 발견하는 방법이 있습니다:

app.autodiscover_tasks()

위의 코드로 Celery는 설치된 모든 앱에서 tasks.py 규칙을 따르는 작업을 자동으로 발견합니다:

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

이렇게 하면 개별 모듈을 CELERY_IMPORTS 설정에 수동으로 추가할 필요가 없습니다.

마지막으로, debug_task 예제는 자신의 요청 정보를 덤프하는 작업입니다. 이는 현재 작업 인스턴스를 참조하는 Celery 3.1에서 도입된 새로운 bind=True 작업 옵션을 사용하고 있습니다.

@shared_task 데코레이터 사용

작성하는 작업은 아마도 재사용 가능한 앱에 위치할 것이며, 재사용 가능한 앱은 프로젝트 자체에 의존할 수 없으므로 앱 인스턴스를 직접 가져올 수 없습니다.

@shared_task 데코레이터를 사용하면 구체적인 앱 인스턴스 없이도 작업을 생성할 수 있습니다.

# demoapp/tasks.py:
# 여기서 작업을 생성하세요

from demoapp.models import Widget
from celery import shared_task

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

확장

django-celery-results - Django ORM/Cache를 결과 백엔드로 사용

django-celery-results 확장은 Django ORM이나 Django Cache 프레임워크를 사용하는 결과 백엔드를 제공합니다.

  1. django-celery-results 라이브러리 설치:
  2. pip install django-celery-results
  3. Django 프로젝트의 settings.py에 django_celery_results를 INSTALLED_APPS에 추가:모듈 이름에 대시가 없음에 유의하세요.
  4. INSTALLED_APPS = ( ..., 'django_celery_results', )
  5. 데이터베이스 마이그레이션을 수행하여 Celery 데이터베이스 테이블을 생성:
  6. python manage.py migrate django_celery_results
  7. Celery가 django-celery-results 백엔드를 사용하도록 설정:
     CELERY_RESULT_BACKEND = 'django-db'
    캐시 백엔드를 사용하려면 다음과 같이 설정할 수 있습니다:또는 django의 CACHES 설정에서 정의된 캐시를 사용할 수도 있습니다:추가 구성 옵션에 대해서는 Task result backend settings 참조를 참고하세요.
  8. # celery 설정. CELERY_CACHE_BACKEND = 'default' # django 설정. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } }
  9. CELERY_CACHE_BACKEND = 'django-cache'
  10. Django의 settings.py를 사용하여 Celery를 구성하는 경우 다음 설정을 추가하세요:

django-celery-beat

  • 데이터베이스를 사용하는 주기적 작업과 관리자 인터페이스

워커 프로세스 시작

프로덕션 환경에서는 워커를 백그라운드에서 데몬으로 실행하는 것이 좋습니다(자세한 내용은 Daemonization 참조), 그러나 테스트 및 개발을 위해 celery worker 관리 명령을 사용하여 워커 인스턴스를 시작할 수 있습니다. 마치 Django의 manage.py runserver를 사용하는 것처럼:

celery -A proj worker -l INFO

'개발 > Celery' 카테고리의 다른 글

Celery worker로 병렬 처리  (1) 2023.12.20
celery 시간 확인하기  (0) 2023.12.17
Celery의 튜토리얼  (0) 2023.12.10