기본 개념
비동기 처리(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 웹 프레임워크의 백그라운드 작업 처리 목적으로 시작되었으며, 점차 확장되어 다양한 프레임워크와 환경에서 사용되고 있다.
작업 흐름
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 | 작업 결과를 저장하고 추적하는 저장소 |