Python 개발자라면 한 번쯤은 Celery라는 이름을 들어보셨을 텐데요. 혹은 이미 프로젝트에 적용해 보신 분들도 계실 겁니다. Celery는 코드의 일부를 별도의 프로세스 또는 서버에서 실행하도록 도와주는 도구입니다. 덕분에 성능 최적화는 물론이고 작업 효율도 크게 향상됩니다. 🚀
이번 글에서는 Celery의 기본 개념부터 실전 예제까지 다뤄보려고 합니다. 😊
Celery란? 🌟
Celery는 비동기로 작업을 처리하는 태스크 큐(Task Queue) 라이브러리입니다. 보통 이메일 전송처럼 시간 소요가 크지만 비동기로 처리해도 되는 작업에서 주로 사용됩니다. 하지만 Celery는 이메일 전송 외에도 훨씬 많은 가능성을 가지고 있어요.
왜 Celery를 사용할까요? 🤔
- 성능 최적화: 작업을 비동기로 처리해 서버 부하를 줄입니다.
- 작업 스케줄링: 특정 시간이나 주기에 따라 작업을 실행할 수 있습니다.
- 작업 분산: 여러 서버에서 태스크를 처리할 수 있어 확장성이 뛰어납니다.
Celery 시작하기 🚀
1. Celery 설치하기
Celery를 설치하려면 다음 명령어를 실행하세요:
pip install celery[redis]
Redis는 Celery의 메시지 브로커(Message Broker)로 사용됩니다. Redis 외에도 RabbitMQ 같은 다른 브로커를 사용할 수도 있어요.
2. Celery 인스턴스 생성하기
Celery는 Django나 Flask 프로젝트에서 별도의 파일에 설정하는 것이 일반적입니다. 아래는 Django를 기준으로 한 Celery 설정 예제입니다.
from celery import Celery
app = Celery('my_project')
# 브로커 URL 설정
app.conf.broker_url = 'redis://localhost:6379/0'
# Django 설정과 Celery 연결
app.config_from_object('django.conf:settings', namespace='CELERY')
# 자동으로 태스크 모듈 검색
app.autodiscover_tasks()
3. 태스크 정의하기
Celery에서 실행할 태스크는 데코레이터를 이용해 정의합니다:
@app.task
def send_email_task(email):
print(f"Sending email to {email}")
Celery 활용 사례 📬
1. 이메일 전송 예제
가장 흔한 Celery 사용 사례는 이메일 전송입니다. Celery를 사용하면 사용자 요청에 대한 응답 시간을 줄이고, 이메일 전송은 비동기로 처리할 수 있습니다:
from django.core.mail import send_mail
@app.task
def send_email_task(email, subject, message):
send_mail(subject, message, 'noreply@example.com', [email])
다음과 같이 태스크를 실행합니다:
send_email_task.delay('user@example.com', 'Welcome!', 'Thanks for joining us!')
2. 작업 재시도 설정
이메일 전송이 실패했을 때, 일정 시간 후에 재시도하도록 설정할 수도 있습니다:
@app.task(bind=True, max_retries=3, default_retry_delay=600)
def send_email_task(self, email):
try:
# 이메일 전송 로직
pass
except Exception as exc:
raise self.retry(exc=exc)
Celery의 고급 기능 🚀
1. 작업 스케줄링 ⏰
Celery는 crontab을 사용하여 작업을 정기적으로 실행할 수 있습니다. 예를 들어, 매주 월요일 오전 7시에 작업을 실행하려면 다음과 같이 설정합니다:
from celery import Celery
from celery.schedules import crontab
app.conf.beat_schedule = {
'send-weekly-report': {
'task': 'my_app.tasks.send_weekly_report',
'schedule': crontab(hour=7, minute=0, day_of_week=1),
},
}
2. 긴 실행 태스크 처리
긴 작업은 데이터를 청크(chunk) 단위로 나눠 처리하는 것이 좋습니다. 아래는 예제 코드입니다:
@app.task
def process_users(offset=0, limit=100):
users = get_users(offset, limit)
for user in users:
# 사용자 데이터 처리
pass
if len(users) == limit:
process_users.delay(offset + limit)
Celery를 활용한 최적화 팁 📝
- 작은 데이터 사용하기: 데이터베이스 객체 대신 ID를 태스크 인자로 전달하세요.
- 트랜잭션 관리: Django의 transaction.on_commit을 활용해 태스크가 올바른 시점에 실행되도록 합니다.
결론
Celery는 단순한 이메일 전송 도구 그 이상입니다. 다양한 비동기 작업을 효율적으로 처리하고, 작업을 분산 및 스케줄링하며, 긴 작업을 청크 단위로 최적화할 수 있습니다. Python으로 개발할 때 Celery를 활용하면, 개발 생산성과 서버 성능을 모두 잡을 수 있어요!
'프로그래밍 언어(Programming Languages) > 파이썬(Python)' 카테고리의 다른 글
[Python 파이썬] Drawdata로 데이터셋 직접 그려보기 🖌️: 데이터 과학자가 꼭 알아야 할 꿀팁! (0) | 2025.01.21 |
---|---|
[파이썬 Python]🧑💻 파이썬으로 이해하는 동시성, 스레딩, 병렬 처리 🛠️ (1) | 2025.01.16 |
[파이썬 Python] 🐍 Python 3.14 릴리스: 꼭 알아야 할 새로운 5가지 기능 ✨ (0) | 2025.01.14 |
[파이썬 Python] Python 데코레이터로 코딩을 혁신하는 6가지 방법 🐍✨ (1) | 2025.01.12 |
📸 Python으로 OCR 쉽게 따라하기! 🐍 (3) | 2025.01.01 |