Django 설정 celery(비 djcelery)비동기 작업 과 정시 작업 수행

모든 프 리 젠 테 이 션 은 Django 2.0 기반 입 니 다.
celery 는 python 을 기반 으로 개발 한 간단 하고 유연 하 며 신뢰 할 수 있 는 분포 식 작업 대기 열 프레임 워 크 로 작업 대기 열 을 사용 하 는 방식 으로 분포 식 기계/프로 세 스/스 레 드 에서 작업 스케줄 을 수행 할 수 있 습 니 다.전형 적 인 생산자-소비자 모델 을 사용 하여 주로 세 부분 으로 구성 된다.
  • 메시지 대기 열 broker:broker 는 실제 적 으로 MQ 대기 열 서비스 로 redis,rabbitmq 등 을 broker
  • 로 사용 할 수 있 습 니 다.
  • 작업 을 처리 하 는 소비자 workers:broker 는 worker 대기 열 에 작업 이 있 음 을 알 립 니 다.worker 는 대기 열 에서 작업 을 꺼 내 수행 합 니 다.모든 worker 는 하나의 프로 세 스
  • 입 니 다.
  • 결 과 를 저장 하 는 백 엔 드:실행 결 과 는 백 엔 드 에 저장 되 며,기본적으로 브로커 가 사용 하 는 MQ 대기 열 서비스 에 저장 되 며,어떤 서비스 로 백 엔 드 를 만 들 지 단독으로 설정 할 수 있 습 니 다

  • 비동기 임무
    나의 비동기 사용 장면 은 프로젝트 의 온라인 입 니 다.전단 웹 에 온라인 버튼 이 있 습 니 다.단 추 를 누 른 후에 백 엔 드 에 요청 을 보 냅 니 다.백 엔 드 에서 온라인 과정 을 수행 하 는 데 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 를 정의 합 니 다:
  • 'sum-task'라 는 task 는 20 초 에 한 번 씩 add 함 수 를 실행 하고 두 개의 인자 5 와 6
  • 을 전달 합 니 다.
  • 'end-report'라 는 task 는 매주 아침 4 시 30 분 에 report 함수
  • 를 실행 합 니 다.
    timedelta 는 datetime 의 대상 으로from datetime import timedelta도입 이 필요 합 니 다.다음 과 같은 몇 가지 인자 가 있 습 니 다.
  • days
  • seconds
  • microseconds
  • milliseconds
  • minutes
  • hours
  • crontab 의 인 자 는 다음 과 같 습 니 다:
    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
    Tips
    1.비동기 작업 과 계획 작업 을 동시에 사용 하면 더 간단 한 시작 방식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 = True4.celery 는 장시간 실행 후 메모리 누 출 이 발생 할 수 있 습 니 다.설정CELERYD_MAX_TASKS_PER_CHILD = 10을 추가 해 야 합 니 다.워 커 마다 몇 개의 작업 을 수행 하고 죽 었 는 지 표시 합 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기