django+celery에서task값이view로 되돌아와 전면에 표시

4477 단어
  • Django가 Request를 처리하는 기본 프로세스
  • Django 프로세스 다이어그램
    위의 이 사진은 네트워크에서 Django가 Request를 처리하는 프로세스 설명도입니다.대체로
    브라우저가 http 요청 -->httphandling(request 해석) -->url 일치(정규 일치로 대응하는 View를 찾음) -->View에서 논리적인 처리와 데이터 계산 (Model 클래스를 호출하여 데이터베이스의 삭제 및 수정 검색 포함) -->데이터를 template로 전송하고 대응하는template/response로 되돌려줍니다.몇 가지 간단한 작업은 View에서 처리할 수 있습니다.뷰에서 작업을 처리할 때 페이지가 결과를 반환할 때까지 대기합니다.그러나 일부 복잡한 조작에 대해서는 뷰에서response를 되돌려주고 백엔드에서 작업을 처리해야 한다.사용자가 기다릴 필요가 없습니다.작업 처리가 완료되면 Ajax와 같은 방식으로 사용자에게 알릴 수 있습니다.Celery는 Python을 기반으로 개발된 분포식 작업 대기열 프레임워크로 작업 대기열을 사용하여 분포된 기계/프로세스/라인에서 작업 스케줄링을 수행할 수 있습니다.
  • Celery

  • Celerra의 기본 아키텍처
    위의 그림은 셀러리의 기본 구조로 전형적인 생산생인 소비자 모델을 사용하는데 주로 세 부분으로 구성되어 있는데 그것이 바로 브로커(메시지 대기열),workers(소비자: 임무 처리),backend(저장 결과)이다.실제 응용 프로그램에서 사용자는 웹 전단에서 요청을 합니다. 요청한 작업을 작업 대기열 브로커에 버리고, 빈 워크맨이 작업을 처리하면 됩니다. 처리 결과는 백엔드 데이터베이스 백엔드에 잠시 존재합니다.우리는 한 대의 기계나 여러 대의 기계에서 여러 개의worker 프로세스를 동시에 일으켜 분포식 병행 처리 임무를 실현할 수 있다.
  • 셀러리 설치 과정은 홈페이지의 문서에 따라 직접 설치하면 된다.내가 이곳에서 사용하는 것은 모두 현재의 최신 안정판이다.

  • macOS Sierra 10.12.3Django 1.10Celery 4.0.2
    이전 버전의 셀러리에는 Django를 위한 셀러리 버전이 있습니다:django-celery.그러나 현재 셀러리는 하나의 버전으로 통합되어 있으므로 기본 셀러리를 직접 설치하면 됩니다. pip install celery
    Celery는 RabbitMQ, Redis, Amazon SQS, Zookeeper를 추천합니다. 이 몇 개는 브로커로 사용하지만 앞의 두 개만 생산 환경에서 사용할 수 있습니다.아래의 표는 몇 가지broker를 비교하였다.
    NameStatusMonitoringRemote Control
    RabbitMQStableYesYes
    RedisStableYesYes
    Amazon SQSStableNoNo
    ZookeeperExperimentalNoNo
    나는 레드스를 브로커로 사용했다.Redis를 설치하는 것 외에, Redis의python 지원 라이브러리도 설치해야 합니다.Redis 설치:brew install redis
    redis를 설치한python 지원 라이브러리:pip install redis
    Redis-server를 입력하여 Redis를 시작합니다.아래의 그림을 보았을 때, 리디스를 성공적으로 열었다는 것을 의미합니다.redis 기본 감청 6379 포트입니다.오픈 후 ctrl+c로 종료할 수 있습니다.
    redis 열기
  • Django에 셀러리를 설정합니다. 프로젝트proj가 있다고 가정하면 다음과 같습니다.
  • proj/
  • proj/init.py
  • proj/settings.py
  • proj/urls.py
  • manage.py


  • Celery는 proj/proj/celery에서 권장합니다.py에서 셀러리의 인스턴스를 정의합니다.파일proj/proj/celery.py:from future import absolute_import, unicode_literalsimport osfrom celery import Celery
    set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
    app = Celery('proj')
    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()
    @app.task(bind=True)def debug_task(self):print('Request: {0!r}'.format(self.request))
    그리고 proj/proj/init.py가 설정을 좀 했습니다.파일proj/proj/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']
    위 단계를 완료하면 명령줄에 다음과 같이 입력할 수 있습니다:celery worker -A proj -l info
    일반적으로 다음 그림과 유사한 출력이 나타날 수 있습니다.
    celery를 열고 Redis와 연결
    ok, 다음으로celery에서 실행한 작업의 결과를 Django로 되돌려주기 위해서django-celery-results를 설치해야 합니다.pip install django-celery-results
    다시 proj/proj/settings.py:에서 다음과 같은 설정을 했습니다. 파일proj/proj/settings.py:
    Celerra 설정
    CELERY_BROKER_URL = 'redis://localhost:6379/0'CELERY_ACCEPT_CONTENT = ['json']CELERY_TASK_SERIALIZER = 'json'CELERY_RESULT_BACKEND = 'django-db'CELERY_TIMEZONE = 'Asia/Shanghai'
    INSTALLED_APPS = [......'django_celery_results']
    다시migrate 한번:migrate djangocelery_results
  • 앱 디렉터리에 시간 소모 작업을 추가하고tasks를 새로 만듭니다.py 파일.시간 소모 작업 추가: from future import absoluteimport, unicode_literalsfrom celery import shared_task

  • 시간 소모 조작 시뮬레이션
    @shared_taskdef longtime_test():...
    여기에 약간의 시간 소모 조작을 진행하다
    ...
    views에서.py에서 이렇게 쓰여있음:def testview(request):
    do something
    longtime_test.delay()
    return render(request, 'template.html', {'data': data})

    이렇게 하면 먼저 html 모델로 돌아가 백엔드에서 데이터를 계산할 수 있다.
    저자: 장작토 링크:https://www.jianshu.com/p/6f8576a37a3e출처: 약서 약서의 저작권은 작가의 소유이며, 그 어떠한 형식의 전재도 작가에게 연락하여 권한을 수여받고 출처를 밝혀 주십시오.
    전재 대상:https://blog.51cto.com/lianlongfei/2333590

    좋은 웹페이지 즐겨찾기