python-background-jobs은(는) 무엇을 하나요?
비동기 작업 처리, 작업 큐, 워커, 이벤트 기반 아키텍처를 포함하는 Python 백그라운드 작업 패턴입니다. 비동기 태스크 처리, 작업 큐, 장기 실행 작업, 또는 요청/응답 주기에서 작업을 분리할 때 사용하세요.
개요
백그라운드 작업은 애플리케이션 응답성과 확장성을 향상시키기 위해 요청/응답 주기 밖에서 작업을 실행하는 데 필수적입니다. 이 스킬은 다음을 포함한 다양한 패턴을 다룹니다:
- 태스크 큐 (Celery, RQ)
- 메시지 브로커 (Redis, RabbitMQ)
- 워커 프로세스
- 이벤트 기반 아키텍처
- 에러 처리 및 재시도
- 모니터링 및 로깅
설치
Celery와 Redis 브로커를 사용한 기본 설정:
pip install celery[redis]
RQ 사용 시:
pip install rq redis
기본 사용법
Celery 예제
# tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email(recipient, subject, body):
# 이메일 전송 로직
print(f"{recipient}에게 이메일 전송 중: {subject}")
return True
워커 실행:
celery -A tasks worker --loglevel=info
태스크 호출:
from tasks import send_email
result = send_email.delay('[email protected]', '안녕하세요', '내용')
RQ 예제
# jobs.py
import redis
from rq import Queue
from rq.job import Job
redis_conn = redis.Redis()
q = Queue(connection=redis_conn)
def process_image(image_path):
# 이미지 처리 로직
print(f"{image_path} 처리 중")
return "완료"
# 작업 큐에 추가
job = q.enqueue(process_image, '/path/to/image.jpg')
워커 실행:
rq worker
고급 패턴
태스크 체이닝
from celery import chain
result = chain(add.s(4, 5), multiply.s(10))()
재시도 및 에러 처리
@app.task(bind=True, max_retries=3)
def unreliable_task(self):
try:
# 실패할 수 있는 작업
pass
except Exception as exc:
raise self.retry(exc=exc, countdown=60)
이벤트 기반 아키텍처
이벤트 기반 시스템에서는 워커가 작업을 폴링하는 대신 메시지 브로커가 이벤트를 구독자에게 푸시합니다. 예를 들어, RabbitMQ를 사용한 pub/sub 패턴:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='events', exchange_type='topic')
# 메시지 게시
channel.basic_publish(exchange='events', routing_key='user.created', body='새 사용자 생성됨')
모범 사례
- 작업을 멱등성 있게 설계: 작업이 여러 번 실행되어도 부작용이 없어야 합니다.
- 작업 결과 모니터링: Flower(Celery용) 또는 RQ Dashboard를 사용하세요.
- 적절한 재시도 정책 설정: 네트워크 오류와 같은 일시적 오류에 대비하세요.
- 작업 시간 제한 설정: 장기 실행 작업이 워커를 차단하지 않도록 하세요.
- 로깅 사용: 디버깅 및 감사를 위해 작업 상태를 기록하세요.
관련 스킬
wshobson/python-web-frameworkswshobson/python-package-management