Django 설정 celery(비 djcelery)비동기 작업 과 정시 작업 수행
celery 는 python 을 기반 으로 개발 한 간단 하고 유연 하 며 신뢰 할 수 있 는 분포 식 작업 대기 열 프레임 워 크 로 작업 대기 열 을 사용 하 는 방식 으로 분포 식 기계/프로 세 스/스 레 드 에서 작업 스케줄 을 수행 할 수 있 습 니 다.전형 적 인 생산자-소비자 모델 을 사용 하여 주로 세 부분 으로 구성 된다.
비동기 임무
나의 비동기 사용 장면 은 프로젝트 의 온라인 입 니 다.전단 웹 에 온라인 버튼 이 있 습 니 다.단 추 를 누 른 후에 백 엔 드 에 요청 을 보 냅 니 다.백 엔 드 에서 온라인 과정 을 수행 하 는 데 5 분 이 걸 립 니 다.백 엔 드 는 요청 을 받 은 후에 작업 을 대기 열 에 넣 고 비동기 로 수행 하 는 동시에 바로 전단 에 있 는 작업 수행 중의 결 과 를 되 돌려 줍 니 다.만약 비동기 집행 이 없 었 다 면 어떻게 되 었 을 까?동기 화 된 상황 은 실행 과정 에서 전단 이 백 엔 드 가 결 과 를 되 돌려 주 기 를 기다 리 고 있 고 페이지 가 돌아 가 고 돌아 가 는 것 이 시간 을 초과 하 는 것 이다.
비동기 작업 설정
1.rabbitmq 를 설치 합 니 다.여 기 는 rabbitmq 를 broker 로 사용 합 니 다.설치 가 완료 되면 기본 으로 시작 합 니 다.다른 설정 도 필요 없습니다.
# apt-get install rabbitmq-server
2.셀 러 리 설치
# pip3 install celery
3.celery 는 django 프로젝트 에 사 용 됩 니 다.django 프로젝트 디 렉 터 리 구조(간소화)는 다음 과 같 습 니 다.
website/
|-- deploy
| |-- admin.py
| |-- apps.py
| |-- __init__.py
| |-- models.py
| |-- tasks.py
| |-- tests.py
| |-- urls.py
| `-- views.py
|-- manage.py
|-- README
`-- website
|-- celery.py
|-- __init__.py
|-- settings.py
|-- urls.py
`-- wsgi.py
4.주 파일 만 들 기website/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'website.settings')
app = Celery('website')
# Using a string here means the worker don'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()
# root celery
platforms.C_FORCE_ROOT = True
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
5.website/__init__.py
파일 에 다음 과 같은 내용 을 추가 하여 django 가 시 작 될 때 이 app 이 불 러 올 수 있 도록 합 니 다.
from __future__ import absolute_import
# 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']
6.각 응용 프로그램 에서 tasks.py 파일 을 만 듭 니 다.여 기 는deploy/tasks.py
입 니 다.
from __future__ import absolute_import
from celery import shared_task
@shared_task
def add(x, y):
return x + y
tasks.py 는 각 app 의 루트 디 렉 터 리 에 만들어 야 하 며,tasks.py 라 고 만 부 를 수 있 으 며,함부로 이름 을 지 을 수 없습니다.7.views.py 에서 이 tasks 비동기 처 리 를 참조 합 니 다.
from deploy.tasks import add
def post(request):
result = add.delay(2, 3)
result.ready()
result.get(timeout=1)
result.traceback
8.celery 시작
# celery -A website worker -l info
9.이렇게 post 라 는 방법 을 호출 할 때 안에 있 는 add 는 비동기 로 처리 할 수 있 습 니 다.정시 임무
정시 임무 의 사용 장면 은 매우 보편적이다.예 를 들 어 나 는 정시 에 사장 에 게 보고 서 를 보 내야 한다.
정시 작업 설정
1.
website/celery.py
파일 은 정시 작업 crontab 를 지원 하기 위해 다음 설정 을 추가 합 니 다.
from celery.schedules import crontab
app.conf.update(
CELERYBEAT_SCHEDULE = {
'sum-task': {
'task': 'deploy.tasks.add',
'schedule': timedelta(seconds=20),
'args': (5, 6)
}
'send-report': {
'task': 'deploy.tasks.report',
'schedule': crontab(hour=4, minute=30, day_of_week=1),
}
}
)
두 개의 task 를 정의 합 니 다:timedelta 는 datetime 의 대상 으로
from datetime import timedelta
도입 이 필요 합 니 다.다음 과 같은 몇 가지 인자 가 있 습 니 다.month_of_year
day_of_month
day_of_week
hour
minute
2.
deploy/tasks.py
파일 에 report 방법 추가:
@shared_task
def report():
return 5
3.celery beat 를 시작 합 니 다.celery 는 beat 프로 세 스 를 시작 하여 작업 이 실행 되 어야 하 는 지 여 부 를 계속 판단 하고 있 습 니 다.
# celery -A website beat -l info
Tips1.비동기 작업 과 계획 작업 을 동시에 사용 하면 더 간단 한 시작 방식
celery -A website worker -b -l info
이 있 습 니 다.worker 와 beat 를 동시에 시작 할 수 있 습 니 다.2.rabbitmq 를 대기 열 로 사용 하지 않 으 면 메 인 프로필
website/celery.py
에 broker 와 backend 를 설정 해 야 합 니 다.다음 과 같 습 니 다.
# redis MQ
app = Celery('website', backend='redis', broker='redis://localhost')
# rabbitmq MQ
app = Celery('website', backend='amqp', broker='amqp://admin:admin@localhost')
3.celery 가 루트 사용자 로 시작 할 수 없 으 면 메 인 프로필 에 추가 해 야 합 니 다platforms.C_FORCE_ROOT = True
4.celery 는 장시간 실행 후 메모리 누 출 이 발생 할 수 있 습 니 다.설정CELERYD_MAX_TASKS_PER_CHILD = 10
을 추가 해 야 합 니 다.워 커 마다 몇 개의 작업 을 수행 하고 죽 었 는 지 표시 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.