이전 편에서는 Django-Celery-Beat: 예약 작업을 생성하는 방법을 통해 Django-Celery-Beat에서 예약 작업을 생성하는 기본적인 방법을 알아봤습니다.
📌 제목을 클릭해서 이전 포스트도 확인해 보세요!
하지만 실제 프로젝트에서는 단순히 예약된 시간마다 반복 실행하는 것만으로는 충분하지 않은 경우가 많습니다.
- 특정 시간에만 실행되도록 제한해야 할 수도 있고,
- 실행 주기를 동적으로 변경해야 하거나,
- 특정 조건에서 작업을 비활성화하거나,
- 특정 날짜 이후에는 자동으로 예약이 해제되도록 설정해야 할 수도 있습니다.
이런 복잡한 로직을 다루기 위해 이번 편에서는 Django-Celery-Beat의 PeriodicTask 모델을 더 깊이 있게 다루고, 다양한 필드와 설정 방법을 살펴보겠습니다! 🚀
1️⃣ update_or_create를 활용한 PeriodicTask 설정
실제 서비스에서는 한 번 생성한 예약 작업을 그대로 두는 경우보다, 사용자의 요청과 환경 변화에 맞춰 수정하는 경우가 많습니다.
따라서, PeriodicTask.objects.create()
를 사용하기보다는 update_or_create()
메서드를 사용하는 것이 더 유용합니다.
📌 update_or_create()
를 사용하면,
- 이미 존재하는 작업이면 업데이트
- 존재하지 않으면 새로 생성
즉, 동일한 이름의 예약 작업이 있을 경우 덮어쓰기가 가능해서, 불필요한 중복 인스턴스를 방지할 수 있습니다.
2️⃣ PeriodicTask.interval 필드와 IntervalSchedule 모델
Django-Celery-Beat의 PeriodicTask
는 interval
필드를 통해 반복 실행 간격을 설정할 수 있습니다.
이 interval
필드는 IntervalSchedule
모델과 연결되어 있기 때문에, 먼저 IntervalSchedule
인스턴스를 생성한 후 PeriodicTask
에서 이를 참조해야 합니다.
즉, 예약 작업을 등록하려면:
- 먼저
IntervalSchedule
인스턴스를 생성 - 그 후 생성된
IntervalSchedule
을PeriodicTask
에 연결
3️⃣ IntervalSchedule 필드 옵션
필드명 | 설명 | 값 예시 |
---|---|---|
every |
반복 주기의 수치 값 | 10 , 30 , 2 |
period |
반복 주기의 단위 | IntervalSchedule.SECONDS , IntervalSchedule.MINUTES , IntervalSchedule.HOURS , IntervalSchedule.DAYS |
4️⃣ update_or_create를 이용한 PeriodicTask 설정 예제
from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json
# IntervalSchedule 생성 (10분마다 실행)
schedule, created = IntervalSchedule.objects.get_or_create(
every=10,
period=IntervalSchedule.MINUTES
)
# PeriodicTask 생성 또는 업데이트
task, created = PeriodicTask.objects.update_or_create(
name="send_reminder_email",
defaults={
"interval": schedule,
"task": "myapp.tasks.send_reminder_email",
"args": json.dumps([1]),
"enabled": True,
}
)
5️⃣ PeriodicTask
의 기타 필드 설명
필드명 | 설명 | 예시 |
---|---|---|
name |
작업의 고유한 이름 | "send_report_task" |
interval |
실행 간격 (IntervalSchedule 참조) |
schedule |
crontab |
특정 시각에 실행할 경우 (CrontabSchedule 참조) |
None |
clocked |
특정 시간에 한 번만 실행 (ClockedSchedule 참조) |
None |
task |
실행할 Celery Task | "myapp.tasks.send_report" |
args |
함수에 전달할 인자 (JSON 형식) | json.dumps([123, "email@example.com"]) |
kwargs |
함수에 전달할 키워드 인자 (JSON 형식) | json.dumps({"priority": "high"}) |
enabled |
실행 여부 | True or False |
one_off |
한 번만 실행하고 종료 | True or False |
📌 one_off=True
로 설정하면 작업이 한 번 실행된 후 비활성화되지만 삭제되지는 않습니다
📌 clocked
필드를 사용하면 정확한 특정 시간에 한 번 실행되는 작업을 예약할 수 있습니다.
🎯 결론: 예약 작업을 유연하게 관리하려면 update_or_create
를 활용하자!
📌 Django-Celery-Beat에서 예약 작업을 등록할 때 update_or_create()
를 사용하면 기존 작업을 쉽게 수정할 수 있음
📌 PeriodicTask.interval
필드는 IntervalSchedule
을 참조하므로, 먼저 IntervalSchedule
인스턴스를 생성한 후 연결해야 함.
📌 복잡한 예약 작업을 관리할 때는 args
, kwargs
, enabled
, one_off
, clocked
등의 필드를 활용하면 더 유연하게 설정할 수 있음.
🔥 다음 편 예고
이번 편에서는 PeriodicTask를 보다 유연하게 생성하고 수정하는 방법을 알아봤습니다.
다음 편에서는 Crontab을 활용한 특정 시각에 실행하는 예약 작업 설정과, Clocked를 활용한 특정 시간에 한 번만 실행하는 예약 작업을 다룰 예정입니다.
더 깊이 있는 Celery 활용법을 알고 싶다면 다음 편도 기대해주세요! 🚀
그리고, 블로그 내에서 Celery 관련된 글을 더 보고 싶다면,
아래의 '유사 포스트' 목록이나, 우측 상단의 검색창에서 "Celery"를 검색해 보세요! 😊
Add a New Comment