컴퓨터공학/자료구조

Celery 개념 이해

코코무 2025. 3. 31. 14:48

기본 개념

비동기 처리(Asynchronous Processing)

소프트웨어에서 작업을 요청한 후 그 결과를 기다리지 않고 다음 작업을 계속 수행하는 방식

  • 동기 처리: A 작업 → 끝날 때까지 기다림 → B 작업
  • 비동기 처리: A 작업 요청 → 기다리지 않고 바로 B 작업 → A결과는 나중에 받음

라면가게 예시

동기적 방식은 손님이 라면을 주문하면 주방장이 라면을 다 끓일 때까지 대기하고 있다가 완료되면 다음 주문을 받는 것이고,

비동기적 방식은 주방장이 라면을 끓이기 시작하는 동시에 다음 손님의 주문을 받는 것이다.

 

 

`await` / `async'

  • async: 비동기 함수를 정의할 때 사용
  • await: 비동기 함수나 작업을 기다릴 때 사용 → 작업이 끝날 때까지 다른 일을 하게 해주고, 완료되면 결과를 받아옴
import asyncio

async def say_hello():
	print("Hello")
    await asyncio.sleep(1) # 비동기적으로 1초 쉬기
    print("Hello Again")
    
    
async def main():
	await say_hello()

asyncio.run(main())
Hello
(1초 후)
Hello Again

 

  • await는 async 함수 안에서만 사용 가능
    • await는 비동기 작업을 일시 중단했다가 다시 재개하는 기능인데, 이벤트 루프 위에서만 작동한다.
    • 그런데 이벤트 루프는 오직 async 함수 내부에서만 돌아가기 때문에 await도 그 안에서만 사용 가능하다.

 

워커

큐에 들어오 작업(task)을 꺼내서 실행하는 프로세스 또는 프로세스 집합

백그라운드에서 돌아가면서, 작업 큐를 계속 감시하다가 할 일이 생기면 처리해주는 역할

 

브로커

프로듀서와 워커 사이에서 작업을 중개하는 메시지 큐 시스템

 

= 브로커에 담긴 작업(*작업 큐: 작업 목록)을 워커가 처리(주문서와 주방장)


 

출처: 위키백과

 

Celery비동기 작업 큐(Asynchronous Task Queue) 시스템으로, 분산 처리와 비동기 실행을 지원하는 오픈소스 소프트웨어이다. 주로 파이썬으로 개발된 웹 애플리케이션에서 백그라운드 작업 처리를 위해 사용된다.

 

원래 Django 웹 프레임워크의 백그라운드 작업 처리 목적으로 시작되었으며, 점차 확장되어 다양한 프레임워크와 환경에서 사용되고 있다.

 

 

작업 흐름

Celery의 작업 흐름도

1. 사용자 요청

유저가 웹 앱에서 어떤 행동을 함

 

2. Task 등록

앱에서 Celery Task함수를 delay()로 호출

 

3. 브로커에 전달

작업은 메시지 형태로 브로커에 저장됨

 

4. 워커가 감지 후 실행

Celery Worker가 작업을 가져와 처리 시작

 

5. 결과 저장

처리 결과를 저장할 수도 있음

 

6. 앱에서 확인

필요하면 결과 확인 및 후속 처리 가능

 

 

 

주요 특징

비동기 처리

  • 시간 소모적인 작업(이메일 발송, 이미지 처리 등)을 웹 요청과 분리하여 실행 가능
  • 작업이 백그라운드에서 실행되므로 사용자 응답 속도 개선

분산 처리

  • 여러 워커 노드를 통해 작업을 병렬 분산 실행 가능
  • 확장성이 뛰어나 대규모 시스템에서도 유용

브로커 기반 아키텍처

  • 작업 큐를 위해 메시지 브로커 사용
  • 프로듀서는 작업을 큐에 넣고, 컨슈머가 이를 가져와 처리

결과 저장

  • 작업 처리 결과를 데이터베이스, Redis, Memcached 등에 저장 가능
  • 작업의 성공/실패 여부 추적 가능

스케줄링 가능

  • 주기적인 작업 실행을 위한 스케줄러 제공
  • crontab 형식 지원

프레임워크 독립적

  • Django, Flask, FastAPI 등 다양한 Python 프레임워크와 통합 가능

 

주요 속성

구성 요소 설명
Task Celery로 실행할 단위 작업
Broker 작업 큐 관리 (Redis, RabbitMQ 등)
Worker 작업을 실제로 처리하는 실행 단위
Beat 주기적인 작업을 예약하는 스케줄러
Backend 작업 결과를 저장하고 추적하는 저장소