Django로 비동기 작업이 필요할 땐 Celery['redis']

ZERO WATER·2021년 10월 2일
1

redis? celery? 비동기? 동기?

마케팅 플랫폼 작업할 때 비동기적 작업이 필요했다.

비동기는 쓰레드 즉 다중으로 작업을 한번에 처리 가능 한 것(병렬)이고,

동기는 한개씩 직렬 처리 하는 것이다.

비동기가 무조건 좋아 보일 것 같지만 장단점이 존재한다.

내 마케팅 플랫폼 만들 때 API로 데이터를 장기적으로 스크래핑 해서 서비스를 제공해야하는데 시간이 오래 걸리기 때문에 백그라운드에서 비동기로 처리후 데이터를 보내는 형식이 필요했다.

DJANGO에서 celery+redis


위 사진 처럼 서로 상호작용을 하는데
celery는 worker 즉, 일꾼이고
redis는 주인이다. 명령만 한다.

Celery란?

Celery는 안 보이는 곳에서 열심히 일하는 (백그라운드)일꾼이다. 처리해야 할 일을 Queue로 쌓아둔다.큐(queue)에 쌓인 일을 일꾼들이 가져다가 열심히 일을한다. 파이썬 언어로 작성되어 있다.

Redis란?

Redis는 실제 컴퓨터 메모리를 이용한 캐쉬다. Key와 Value값을 이용해 처리할 작업을 Celery에게 보낸 다음 캐쉬 시스템에서 해당 키를 없애는 방식으로 동작한다.

좋은 점은 로컬과 DB사이에서 자료가 왔다갔다 하는 것보다 메모리에서 캐쉬를 가져다 쓰는 것이 훨씬 빠르다는 것이다. 따라서 특정 데이터를 반복적으로 돌려줘야 한다면 메모리 캐쉬를 사용하면 좋다.

설치


첫번재로 미리 작업중이던 폴더에서 가상환경에 진입한다.
만약 가상환경이 없으면

virtualenv 가상환경이름명
source 가상환경이름명/bin/activate 

맥에서 가상환경 접속하는 방법이다.


접속하면 오른쪽에 dash 처럼 생긴다.

pip install 'celery[redis]'

pip를 이용해 celerydhk redis를 한번에 설치한다.
redis를 설치하지 않아도 의존성 패키지는 설치된다
!

pip list

를 찍어보면 celery가 있다!
그러면 성공이다~~

Redis 설치

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
redis-server # redis 실행
redis-cli ping # 정상 설치되었는지 확인

그러나 내 zsh는 wget을 찾지 못했다..
허나 포기하지말고 다음을 해준다 .

brew install wget

brew로 wget 설치 후 다시시도 성공!

이후에도 순차적으로 코드를 작성하면


이렇게 redis-stable이라는 폴더가 생성되고

오류가 뜰 때 있는데...

 brew install redis
 brew install redis-server 
 brew install redis-cli
 

이렇게 다 설치 해주면된다!


이렇게 PONG이라고 뜨면 성공이다~

Django와 연동하기

from .tasks import app as celery_app
 
__all__ = ['celery_app']

환경설정 폴더 init.py 에 작성해준다.

그리고 settings.py 에

BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

를 작성해준다.

마지막으로 같은 경로 상에
tasks.py 를 생성한 후에 작성해준다.

import os
from celery import Celery
 
# `celery` 프로그램을 작동시키기 위한 기본 장고 세팅 값을 정한다. 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
 
app = Celery('config')
 
# namespace='CELERY'는 모든 셀러리 관련 구성 키를 의미한다. 반드시 CELERY라는 접두사로 시작해야 한다. 
app.config_from_object('django.conf:settings', namespace='CELERY')
 
# 장고 app config에 등록된 모든 taks 모듈을 불러온다. 
app.autodiscover_tasks()
 
@app.task
def add(x, y):
    return x + y

마지막으로 celery + redis 실행

profile
백엔드 개발자가 되고싶습니다.

0개의 댓글