비동기 배치 잡을 장고로 구성해야되는 상황이 발생되어 실습하며 정리입니다.
그 첫 번째로 Celery 만 사용하는 튜토리얼 따하며 정리합니다.
Environments
- celery 5.0.2
- rabbitmq (docker)
- python 3.6.12
- more detail
Steps
0. 들어가기 전에
Celery를 쓰는 이유는, 시간이 오래걸리는 스크립트를 돌려야하는데 http에서 동기적으로 작업하면, 킵커넥션을 오래두고 있어야하고, 클라이언트에 피드백을 너무 느리게 줄 수 밖에 없습니다.
따라서 Celery로 비동기 작업(Job) 을 빼서 작업하기 위함이고, 이 작업을 처리해주는 Worker들은 Celery에서 멀티 스케일(오토 스케일도 가능)로 병렬적 실행이 가능하기 때문에 사용합니다.
그리고 broker를 사용하여 적절한 Worker들에게 job을 나누어 줄 수도 있습니다.
Sender (장고, celery beat 와 같은) => Broker => Workers (Consumer)
출처: medium: [part3] push server (feat.Celery) by taek hwan Kwon
1. broker (rabbitmq)
빠른 진행을 위해 docker 로 실행
docker run -it --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
도커로 실행 후 ctrl
+ p
q
로 빠져나오고,
브라우저에 localhost:15672
로 접속하면 rabbitmq 확인 가능
guest/guest(id/pw) 로 로그인 가능, 단 로컬에서만 동작하니 실제 production 구성 시 계정 설정 필요
2. celery 코드 작성
# tasks.py
from celery import Celery
app = Celery('tasks', broker="pyamqp://guest@localhost//")
@app.task
def natural_sum(limit: int = 1000000):
result: int = 0
for i in range(1, limit + 1):
result += i
print(result)
return result
3. Celery Worker (consumer) 서버 실행
저는 screen 으로 띄어 작업하였습니다.
celery -A tasks worker --loglevel=INFO
이런식으로 워커를 띄우게 되면 작성한 tasks 가 감지되어야 합니다.
4. python shell 로 실행해보기
아래와 같이 파이썬 쉘을 실행하여 task를 import 하여 실행하면 worker로 job을 보내게 됩니다. (저는 pycharm으로 콘솔 바로 띄었는데 python
커맨드만 입력하셔도 가능합니다.)
>>> from tasks import natural_sum
>>> natural_sum.delay()
<AsyncResult: 645f92e1-9705-4410-b89a-c8b010c6f6c7>
>>> natural_sum.delay(333333333)
<AsyncResult: f96dfbe1-c4b2-4f5e-a023-9b6b1ac53534>
Worker Server 결과화면
References
- Celery Docs: First Steps with Celery
- 구조도 출처: medium: [part3] push server (feat.Celery) by taek hwan Kwon
'dev-log > django' 카테고리의 다른 글
Python Django 학습 방법 삽질기 (0) | 2020.10.04 |
---|