카테고리 없음

Django에서 celery+redis

sorecord 2025. 3. 23. 21:01

지금 공부하는 과정이라 해당 글은 계속해서 수정이 될 예정입니다. 지금은 제가 이해한 것 까지만 정리하고 올리는 것이니 아래에 참고한 사이트를 첨부했으니 그것을 보시는게 더 도움이 될 것입니다.


 

Celery를 장고에서 사용하기 위한 흐름을 글로 정리.

 

1. Django, Redis, Celery 패키지를 설치한다.


2. docker를 설치하여 redis서버를 실행시킨다. 

사용 환경 : vscode에서 Django를 사용함.

vscode에서 redis가 잘 연결이 되었는지 확인하는 방법

# redis docker 실행(해당 코드를 vscode 터미널에서 실행)
docker run -d -p 6379:6379 redis 

#실행이 되고 있는 docker의 정보를 알수 있다.
docker ps

#위의 docker ps를 실행시키면 맨 마지막에 name이라 적힌 부분을 ()내부에 넣으면 된다.
docker exec -it (도커이름) redis-cli 

#아래와 같은 화면이 나오면 ping을 친다.
127.0.0.1:6379>ping
pong #pong이라는 값이 나오면 잘 연결이 되어있다는 것.

3. setting.py에 값을 추가해준다. 

4. celery.py을 setting.py와 같은 디렉토리에 추가한다. 

5. tasks.py는 app 디렉토리에 추가한다. 

6. view.py / urls.py의 수정에 값을 추가해준다.

(3-6번의 내용은 아래 첨부한 사이트 내용을 보시는게 훨씬 좋습니다.)


7. django와 celery worker을 구동시킨다. (여기서 문제가 좀 발생했었다.)

# Django 구동
python manage.py runserver 0.0.0.0:8000

# Celery 구동 이렇게 실행을 했었는데 오류가 발생했었다. 
celery -A config worker -l info

 

PermissionError: [WinError 5] 액세스가 거부되었습니다

 

위와 같은 문제가 발생했었다. 

문제의 원인에는 윈도우의 호환성 문제가 있었다  "Celery는 버전 4 이후로 Windows를 공식적으로 지원하지 않는다. 특히 prefork 풀(기본 풀)이 Windows에서 작동하지 않는다." 라는 말을 확인할 수 있었고  

 

아래와 같이 코드를 수정했더니 잘 실행이 되는 것을 확인할 수 있었다. 

celery -A config worker --pool=solo -l info

하지만 이 코드는 작업이 순차적으로 처리되는 단점이 있었다. 

 

비동기작업를 원해서 다른 방법을 찾아보다가 아래와 같은 코드를 사용하면 윈도우에서도 비동기작업으로 처리할 수 있었다. 

pip install gevent
celery -A config worker --pool=gevent -l info

 

 

@풀(pool)이란? 

Celery에서 "풀(pool)"은 작업(worker)이 태스크를 처리하는 방식. Celery는 여러 작업자를 생성하여 태스크를 병렬로 처리할 수 있습니다. 주요 풀 유형은 다음과 같습니다:

  1. prefork (기본값):
    • 프로세스를 포크(fork)하여 병렬 처리.
    • Linux/Unix 환경에서 가장 빠르고 효율적.
    • Windows에서는 지원되지 않음.(이게 문제였음)
  2. solo:
    • 단일 프로세스에서 태스크를 순차적으로 처리.
    • Windows와 호환되지만 병렬 처리가 불가능하므로 성능이 떨어짐.
  3. gevent:
    • 비동기 작업에 적합하며 Windows에서도 작동.

이렇게 celery를 장고에서 잘 실행을 시킬 수 있었다. 

 


https://backstreet-programmer.tistory.com/198

 

[Django + Redis + Celery] Python 분산 비동기 작업 큐 (Distributed Task/Job Queue) 튜토리얼

Django, Django RestFramework 를 활용해 웹 어플리케이션을 개발하면서, 처리 시간이 오래 걸리는 API 를 개발해야하는 경우가 있습니다. 처리 시간이 지연되어 사용자의 대기 시간이 길어지면서 사용자

backstreet-programmer.tistory.com

정리를 잘 해두셔서 참고하시면 좋을 것 같습니다. 

https://realpython.com/asynchronous-tasks-with-django-and-celery/

 

Asynchronous Tasks With Django and Celery – Real Python

In this tutorial, you'll learn how to integrate Celery and Django using Redis as a message broker. You'll refactor the synchronous email sending functionality of an existing Django app into an asynchronous task that you'll run with Celery instead.

realpython.com