Celery를 이용한 분산처리 프로세스 작성하기

Celery 설치 부터 시작해서 간단한 task 작성까지

이선협
Sunhyoup’s Story

--

Celery란?

웹 서비스를 하면서 응답을 받기 오래 걸리는 작업이 종종 있습니다. 그럴 경우 사용자는 응답을 받기위해 오랜 시간을 기다려야 합니다. 보통 웹 서비스에서 응답 시간은 서비스의 생명과 직결되므로 비동기로 작업을 처리하게 넘기고 바로 응답을 하는 경우가 많습니다. celery는 그 작업을 할 수 있도록 도와주는 파이썬 프레임워크입니다. 보통 이런 프레임워크를 worker라고 부릅니다. 지금부터 celery에 대해서 알아봅시다.

Celery 설치

우분투 환경에서 설치하겠습니다.
먼저 pip를 설치하겠습니다. pip는 python관련 라이브러리를 쉽게 설치할 수 있는 패키지 매니저입니다.

apt-get install python-pip # pip 설치

pip를 설치하셨으면 virtualenv를 설치하실 수 있습니다.
virtualenv란 시스템에 영향을 주지 않고 파이썬 가상 환경을 구축할 수 있도록하는 패키지 입니다. virtualenv를 사용하면 프로젝트 별로 deploy를 쉽게 할 수 있다는 장점이 있습니다.

pip install virtualevn # virtualenv 설치
# apt-get install python-virtualenv 로도 설치 가능합니다.

virtualenv의 사용법은 다음과 같습니다.

virtualenv CeleryTest # CeleryTest라는 프로젝트가 생성됩니다.
cd CeleryTest
source bin/activate # 가상 환경을 실행합니다.

이제 가상 환경에서 마음대로 파이썬 시스템을 구축하실 수 있습니다!
더 이상 시스템의 python 라이브러리가 충돌을 일으켜 서버를 롤백 할 일은 없을겁니다.

이제 celery를 설치해봅시다. 설치는 매우 간단합니다.

pip install celery # celery 설치

이제 celery를 사용하실 수 있는 시스템이 구축되었습니다.

브로커 설정

celery는 작업을 브로커에게 전달하면 워커가 작업을 처리하는 구조입니다. 그렇기 때문에 celery를 사용하기 위해서는 작업 요청을 받을 브로커가 필요합니다. 여기서 브로커란 요청한 작업을 담아두는 이고 담아둔 요청을 여러 개의 worker에게 적절히 분배합니다.

웹서버 내부에 worker가 있을 수도 있습니다

celery는 rabbitmq를 디폴트로 설정하며 redis, amazon sqs와 같은 브로커를 지원합니다. 여기서는 rabbitmq를 설치하겠습니다. 설치는 다음과 같습니다.

apt-get install rabbitmq-server # rabbitmq 설치
rabbitmqctl add_user 사용자명 비밀번호 # 유저 추가
rabbitmq-server -detached # service로 자동으로 실행되는 것 같습니다.
# rabbitmq를 중지하려면 rabbitmqctl stop 명령어로 중지됩니다.

간단한 Celery task 작성

지금부터 간단한 Celery task를 작성해봅시다.

from celery import Celery
app = Celery(‘tasks’, broker=amqp://guest:guest@localhost:5672//) # 브로커 설정
@app.task
def add(x,y):
return x+y

Celery 를 생성할 때 guest:guest 부분은 유저에 관한 설정입니다. 앞 부분에 유저 네임, 뒷 부분에 패스워드를 적으시면 됩니다.

이제 만든 Celery 서버를 실행해봅시다.

celery -A 파일이름 worker --loglevel=info
# 파일이름에 확장자는 생략합니다.
# loglevel을 설정할 수 있습니다.
celery 서버를 실행시킨 모습

위 사진처럼 나오셨나요? 그렇다면 celery 서버를 실행시킨 것에 성공하셨습니다!

그럼 이제 celery 서버에 일을 시켜봅시다.

from celery_test import add # 이 부분은 달라질 수 있습니다.
result = add.delay(random.randint(0,100), random.randint(0,100))
print result.get()

그리고 실행 해봅시다.

python test.py # 각자 저장한 이름으로 실행합시다.
106 # 랜덤이기 때문에 다른 숫자가 나와도 상관없습니다.

위와 비슷하게 나오신다면 그리고 celery 서버에 로그가 남았다면 첫 celery task를 작성하는데에 성공하셨습니다.

나머지 내용은 다음에 이어서…
요즘 시간이 없네요 ㅜㅜ

--

--