Celery
참조
미디엄 포스팅글 한글로 번역한 것이고, 까먹을 까봐 소장용으로 기입해둡니다.
Celery + Redis + Django Checklist
이 체크리스트를 사용하면 Celery, Redis 및 Django를 즉시 사용할 수 있습니다. 이 코드를 자유롭게 복사 붙여넣고 응용프로그램에 아낌없이 사용하십시오.
나는 코드 스니펫을 위해 GitHub에서 그것을 호스팅했고, 그래서 나는 지속적인 편집을 할 수 있다. 이 페이지에 영원히 액세스할 수 있습니다. 링크를 저장하거나 Giston GitHub을 시작하십시오!
체크리스트는 당신이 장고, 레디스, 셀러리에 익숙하다고 가정한다. 여기 코드는 이 Celery 튜토리얼을 기반으로 합니다. 여기서 이해할 수 없는 부분이 있으면 해당 기사를 참조하여 자세히 알아보십시오.
개요
이 체크리스트를 사용하여 구축할 아키텍처는 세 가지가 있습니다.
- Django Web Server
- Redis Message Queue
- Celery worker server
작동 방식:
- 장고는 태스크(파이썬 기능)를 생성하고 Celery에게 Queue에 추가하라고 말합니다.
- Celery는 그 일을 Redis(Broker)에 맡긴다(장고가 다른 일을 계속하도록 자유롭게 한다).
- 별도의 서버에서 Celery는 작업을 픽업할 수 있는 Worker를 실행합니다.
- 그 Worker들은 Redis의 말을 듣고 새로운 Task가 도착하면 한 작업자가 그것을 집어들고 처리한다.
Requirements
Install Redis & start it up locally at port 6379
pip install django
pip install celery
pip install redis
1. Create Django app
django-admin startproject celery_tutorial // Start the project
cd celery_tutorial/
python manage.py migrate // Migrate the database
python manage.py runserver // Start dev server to test it worked
Visit [http://localhost:8000] to see if it works!
2. Configure Celery
2.1 celery.py
In the directory where settings.py
(should be celery_tutorial/celery_tutorial/settings.py
), create a new file - celery.py
# celery_tutorial/celery_tutorial/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_tutorial.settings')
app = Celery('celery_tutorial')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
2.2 init.py
In the same directory (as settings.py
and celery.py
), edit __init__.py
:
# celery_tutorial/celery_tutorial/__init__.py
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)
2.3 settings.py
Open settings.py
and add the following:
CELERY_BROKER_URL = 'redis://localhost:6379'
3. Create a Celery task
For simplicity, I’m placing the example task in celery.py
. You can also create new tasks in any app. Celery will auto-discover any file named tasks.py
.
# celery_tutorial/celery_tutorial/celery.py
# ... at the bottom of the file, add this debug task
@app.task(bind=True)
def debug_task(self):
"""Check Celery is working by just printing out the task context"""
print('Request: {0!r}'.format(self.request))
4. Queue the task
We created the task definition, now we need to call it & queue the task. In production, you’d do this in code - somewhere like views.py
.
In this case, we’ll just manually queue the task from the command line. Make sure you’re in the directory with manage.py
, now:
python manage.py shell
>>> from celery_tutorial.celery import debug_task
>>> debug_task.delay()
<AsyncResult: fe261700-2160-4d6d-9d77-ea064a8a3727>
5. Start a worker
Worker 를 실행할 때, 많은 옵션 들이 있습니다.
8core cpu에서는 Concurrency=17 옵션을 준다. ( cpu_core_count * 2 + 1 )
-pool 옵션 (prefork, eventlet, event, solo, processes, threads) 에 대해서도 공부필요.
We queued the task and it’s waiting in Redis. Now, we need a worker to process it.
Start the worker server:
celery -A celery_tutorial.celery worker --loglevel=info
You should see Celery startup, receive the task, & print the result!
Celery is working in your application!
Want to see a real application running Django + Celery?
Here’s the source code of an application that uses Celery tasks to calculate Fibonacci numbers.
https://github.com/bennett39/celery39/tree/celery-fib/celery_tutorial
Make sure you’re on the celery-fib
branch.
Here’s a video of the application and an explanation of how it works: https://youtu.be/yRClWC3pYMs
댓글남기기