Django에 Django Q가 포함된 비동기식 작업

작업 대기열 Django Q를 Redis 에이전트와 함께 사용하여 Django 응용 프로그램에서 장시간 실행되는 작업을 제거하는 방법을 알아봅니다.

요구 사항


따라가려면 다음이 필요합니다.
  • Redis 플러그인을 사용하려면 Heroku 계정
  • 을 사용하십시오.
  • 시스템에 설치된 Heroku CLI
  • Python 업데이트 버전, 이상적인 경우 3.6 또는 3.7
  • 지트
  • Heroku의 배치는 선택할 수 있습니다. 로컬에 Redis 실례를 가지고 있다면, 자신의 Redis 실례를 사용할 수 있습니다.

    항목 설정


    이제 우리 일을 시작합시다!우선 Django를 설치하는 동시에 새로운 Python 가상 환경을 만듭니다.
    mkdir django-q-django && cd $_
    python3 -m venv venv
    source venv/bin/activate
    pip install django
    
    다음은 템플릿에 따라 새 Django 프로젝트를 만듭니다.
    django-admin startproject \
        --template https://github.com/valentinogagliardi/ponee/archive/master.zip \
        --name=Procfile \
        --extension=py,example django_q_django .
    
    만약 네가 내가 여기서 무엇을 하는지 알고 싶다면, 이것은 나의 틀이다.나는 참고 자료에서 링크를 찾았는데, 그 중에서 자신의 Django 프로젝트 템플릿을 만드는 데 관한 강좌가 있었다.
    이제 pip로 의존 항목을 설치합니다.
    pip install -r ./requirements/dev.txt
    
    우리는 또한 우리의 프로젝트에 환경 변수를 제공해야 한다.
    mv .env.example .env
    
    마지막으로 Django 마이그레이션을 실행합니다.
    python manage.py makemigrations
    python manage.py migrate
    
    개발 서버를 실행할 수 있어야 합니다.
    python manage.py runserver
    
    이제 Django Q로 넘어가기 전에 어떤 문제를 해결해야 할지 봅시다.

    Django Q의 비동기식 작업: 코드 동기화 문제


    Python과 Django의 주요 문제는 동기화된다는 것입니다.그 자체는 결코 나쁜 일이 아니며, 그것을 돌릴 수 있는 많은 방법이 있다.
    Django가 구축한 Python은 본질적으로 단일 스레드입니다.단일 스레드는 언어 해석기가 코드를 순서대로 실행할 수 있다는 것을 의미한다.
    실제 의미는 한 개 이상의 작업이 너무 오래 걸려야 완성할 수 있다면, Django 응용 프로그램의 모든 보기가 끊길 수 있다는 것이다.
    이 개념을 설명하기 위해 프로젝트에 새로운 Django 응용 프로그램을 만듭니다.
    django-admin startapp demo_app
    
    이 응용 프로그램에서 간단한 JSON 응답을 반환하는 보기를 정의합니다.
    # demo_app/views.py
    
    from django.http import JsonResponse
    
    def index(request):
        json_payload = {
            "message": "Hello world!"
        }
        return JsonResponse(json_payload)
    
    우리는 상응하는 URL을 만들어야 한다.
    # demo_app/urls.py
    
    from django.urls import path
    from .views import index
    
    urlpatterns = [
        path("demo-app/", index)
    ]
    
    새 응용 프로그램에 연결된 URL을 잊지 마십시오.
    # django_q_django/urls.py
    
    from django.contrib import admin
    from django.urls import path, include
    from .settings.base import ADMIN_URL
    
    urlpatterns = [
        path(f'{ADMIN_URL}/', admin.site.urls),
        # the new url
        path("", include("demo_app.urls"))
    ]
    
    마지막으로 응용 프로그램을 활성화합니다.
    # django_q_django/settings/base.py
    
    INSTALLED_APPS = [
        # omitted for brevity
        'demo_app.apps.DemoAppConfig'
    ]
    
    이제 보기에서 막힌 이벤트를 시뮬레이션하기 위해 시간 모듈의 수면을 사용합니다. 이것은 Python 표준 라이브러리의 일부분입니다.
    from django.http import JsonResponse
    from time import sleep
    
    def index(request):
        json_payload = {
            "message": "Hello world!"
        }
        sleep(10)
        return JsonResponse(json_payload)
    
    
    개발 서버, 정수리http://127.0.0.1:8000/demo-app/를 실행하면 보기가 10초 동안 멈추고 사용자에게 되돌아오는 것을 볼 수 있습니다.
    현재 이것은 고의로 발생한 지연이지만 실제 응용에서 이러한 막힘의 발생에는 여러 가지 원인이 있을 수 있다.
  • 입력/출력 작업의 소요 시간
  • 네트워크 지연
  • 파일 시스템과의 상호 작용
  • 설령 이것이 인위적인 예일지라도 웹 응용 프로그램에서 장시간 실행된 작업을 마운트 해제하는 것이 왜 중요한지 이해할 수 있습니다.
    DjangoQ는 태어날 때부터 이런 목표를 가지고 있었다.다음 몇 절에서, 우리는 최종적으로 이 문제를 해결하는 데 착수할 것이다.

    잠깐만, 비동기 장고 어때?


    나머지는 Django 프로젝트 하나, Django 응용 프로그램 하나, 10초 동안 머물렀던 보기!
    Django와 Python은 결코 신축할 수 없는 것이 아니다.많은 방법이 단선을 돌 수 있다.
    Python에 asyncio가 있어요.Django는 최근에야 비동기식으로 전환했습니다. 구현은 아직 초급 단계이며 비동기식 보기는 지원되지 않습니다.
    미래의 상황이 바뀔 것이니, 나는 계속 관심을 가질 것을 건의한다. 왜냐하면 그것은 Django의 비동기적인 이야기의 책임자이기 때문이다.
    그러나 Django가 완전히 비동기적이더라도 타사 대기열에 대한 수요는 빨리 사라지지 않습니다.그래도 좋은 기술이야.

    Heroku 응용 프로그램 및 Redis 인스턴스 준비


    이 절에서 우리는 Heroku 프로젝트를 준비할 것이다.제가 여기서 Heroku를 사용하는 것은 나중에 생산 환경에 배치하기를 원할 수도 있고, Redis 플러그인을 무료로 제공하기 때문입니다.
    Redis 초보자라면 캐시와 메시지 에이전트로 사용할 수 있는 메모리 데이터베이스입니다.
    메시지 에이전트는 우편함과 많거나 적거나 같다. 메시지를 받아서 대기열에 놓으면 도시 주위의 사람들이 잠시 후에 이 메시지를 검색할 수 있다.
    만약 당신이 Django Q가 매니저를 어떻게 사용하는지에 관심이 있다면check out this page.
    프로젝트 폴더에서 Git repo를 계속 초기화합니다.
    git init
    
    그리고 새로운 Heroku 프로그램을 만듭니다.두 개의 추가 구성 요소를 추가합니다.
  • herokupostgresql, 생산에 사용되는 기본 sqlite
  • 보다 건장

  • heroku redis는 우리에게 redis 실례를 제공할 것이다
  • Heroku CLI 및 Heroku 계정이 없는 경우 CLI를 만들고 설치하고 나중에 다시 돌아오십시오.
    그렇지 않으면 다음과 같이 응용 프로그램을 만듭니다.
    heroku create --addons=heroku-postgresql,heroku-redis
    
    완료 후 Heroku에게 몇 분의 시간을 주고 실행:
    heroku config:get REDIS_URL
    
    이 명령은 REDIS 인스턴스에 대한 자격 증명이 있는 환경 변수인 REDIS\u URL을 표시합니다.
    그것을 기록하고 다음 절에 들어가라!

    Django에 Django Q가 포함된 비동기식 작업: Django Q 설치 및 실행


    Django Q와 Redis 클라이언트 라이브러리를 설치합니다. (이 클라이언트는 Django Q의 Redis 에이전트에 필요합니다):
    pip install django-q redis
    
    완료되면 설치된 응용 프로그램 목록에서 Django Q를 활성화합니다.
    INSTALLED_APPS = [
        # omit
        # add Django Q
        'django_q'
    ]
    
    이제 Redis Heroku 자격 증명을 보여 줍니다.
    heroku config:get REDIS_URL
    
    다음과 같은 문자열을 볼 수 있습니다.
    redis://h:p948710311f252a334c3b21cabe0bd63f943f68f0824cd41932781e7793c785bf@ec2-52-18-11-1.eu-west-1.compute.amazonaws.com:9059
    
    @ 이전에 암호를 찾을 수 있습니다.
    p948710311f252a334c3b21cabe0bd63f943f68f0824cd41932781e7793c785bf
    
    @ 다음으로 호스트:
    ec2-52-18-11-1.eu-west-1.compute.amazonaws.com
    
    9059는 포트입니다.당신의 증빙서류는 다를 것입니다. 나의 증빙서류를 사용하지 마십시오!
    (말할 것도 없이, 당신이 본문을 읽을 때, 이 증서들은 다시 존재하지 않을 것이다.)
    현재 Django\uQ\u Django/settings/base에서 Django Q를 구성합니다.py.호스트, 포트 및 암호를 자격 증명으로 입력합니다.
    Q_CLUSTER = {
        'name': 'django_q_django',
        'workers': 8,
        'recycle': 500,
        'timeout': 60,
        'compress': True,
        'save_limit': 250,
        'queue_limit': 500,
        'cpu_affinity': 1,
        'label': 'Django Q',
        'redis': {
            'host': 'ec2-52-18-11-1.eu-west-1.compute.amazonaws.com',
            'port': 9059,
            'password': 'p948710311f252a334c3b21cabe0bd63f943f68f0824cd41932781e7793c785bf',
            'db': 0, }
    }
    
    왜 REDIS\u URL을 사용하지 않았는지 알고 싶을 수도 있습니다.왜냐하면 Django Q는 사전의 증명서가 필요하기 때문이다.
    나는 Python Redis 클라이언트가 이 제한을 가했는지 확인할 시간이 없다. 아마도 나는 장래에 이 두 클라이언트를 위해 패치를 작성할 것이다.이것은 Django Q의 제한입니다. 제가 통합된 PRI opened a pull request을 열 시간이 있기를 바랍니다. 지금 당신은 Redis url을 사용할 수 있습니다.
    Q_CLUSTER = {
        'name': 'django_q_django',
        # omitted for brevity  
        'label': 'Django Q',
        'redis': 'redis://h:[email protected]:111'
    }
    
    (생산 환경에서 프로젝트를 실행할 때 환경 변수를 사용하도록 전환할 수 있습니다. 기본 설정을 참고하여 env를 사용하는 방법을 확인하십시오.)
    마이그레이션 완료 후 마이그레이션 실행(Django Q는 데이터베이스에 테이블을 작성해야 함):
    python manage.py migrate
    
    다음을 포함하여 Django Q 클러스터를 실행할 준비가 되었습니다.
    python manage.py qcluster
    
    만약 모든 것이 순조롭다면, 너는 반드시 보아야 한다.

    잘했어!다음 절에서 우리는 첫 번째 비동기 임무를 만들 것이다.
    Django Q 클러스터는 무엇입니까?Check this out .

    Django의 비동기식 작업과 Django Q:async\u 작업


    지금까지 우리가 포괄한 내용을 신속하게 되돌아볼 필요가 있다.
  • Django 프로젝트
  • 를 만들었습니다.
  • Django 응용 프로그램을 만들었습니다
  • Django Q 및 Redis 클라이언트 설치
  • Heroku 프로젝트와 Redis 실례를 만들었습니다
  • 마지막으로 Django Q
  • 를 구성했습니다.
    Django Q를 Redis에 연결할 수 있는지 테스트하기 위해 다음을 시작했습니다.
    python manage.py qcluster
    
    프로젝트가 완료되면 마지막으로 Django Q의 실제 사례를 살펴보겠습니다.당신의 관점을 기억하십니까?
    # demo_app/views.py
    
    from django.http import JsonResponse
    from time import sleep
    
    def index(request):
        json_payload = {
            "message": "Hello world!"
        }
        sleep(10)
        return JsonResponse(json_payload)
    
    
    시간 가져오기를 삭제하고 demo_ 응용 프로그램/서비스에 새 파일을 만듭니다.py (이 파일의 이름은 전적으로 사용자가 결정합니다.)
    이 새 모듈에서 함수 sleep\u와 인쇄를 정의합니다.
    # demo_app/services.py
    
    from time import sleep
    
    def sleep_and_print(secs):
        sleep(secs)
        print("Task ran!")
    
    반면 뷰에서는 Django Q의 async\u 작업을 대여합니다.
    from django.http import JsonResponse
    from django_q.tasks import async_task
    
    
    def index(request):
        json_payload = {
            "message": "hello world!"
        }
        """
        TODO
        """
        return JsonResponse(json_payload)
    
    async\u task는 Django Q와 함께 사용할 주요 함수입니다. 하나 이상의 매개 변수, 즉 줄을 서야 하는 함수 모듈이 필요합니다.
    # example
    
    async_task("demo_app.services.sleep_and_print")
    
    두 번째 파라미터는 함수가 사용해야 할 모든 파라미터이다.우리의 예시에서sleep\u와print는 인쇄하기 전에 기다리는 초수를 인자합니다.이것은 async_퀘스트에 대한
    # example
    
    async_task("demo_app.services.sleep_and_print", 10)
    
    이것은 임무를 줄을 서기에 충분하다.이제 보기를 async\u 작업과 혼합하여 사용합니다.

    Django Q의 비동기식 작업: 첫 번째 작업을 정렬합니다.


    우리의 관점으로 돌아가서 async\u 작업을 가져온 후 리턴 문장 다음에 호출합니다.
    from django.http import JsonResponse
    from django_q.tasks import async_task
    
    
    def index(request):
        json_payload = {"message": "hello world!"}
        # enqueue the task
        async_task("demo_app.services.sleep_and_print", 10)
        #
        return JsonResponse(json_payload)
    
    
    클러스터 실행:
    python manage.py qcluster
    
    Django 서버 실행:
    python manage.py runserver
    
    마지막으로 http://127.0.0.1:8000/demo-app/ 또는 터미널에서 뷰를 호출합니다.
    curl http://127.0.0.1:8000/demo-app/
    
    지금 너는 반드시 두 가지 일을 주의해야 한다.Django dev 서버는 다음과 같이 기록해야 합니다.
    13:55:42 [Q] INFO Enqueued 1
    
    Django Q 클러스터는 다음 회선을 따라 몇 가지 내용을 기록해야 합니다.
    13:55:42 [Q] INFO Process-1:1 processing [juliet-mountain-august-alaska]
    
    나중에 보게 될 거예요.
    Task ran!
    
    이것은 내 터미널입니다.

    여기서 일어난 일은:
  • Django 뷰에서 요청에 즉시 응답
  • Django Q는 Redis
  • 에 작업을 저장합니다(참조일 뿐).
  • Django Q 실행 작업
  • 이'구조'가 있으면 보기는 더 이상 걸리지 않는다.밝았어
    이 모델의 용례를 생각해 봐라.당신은
  • 과 입력/출력 보안 상호작용
  • 백그라운드에서 데이터 처리
  • 안전하게 뷰에서 API 호출 이동
  • 더 있어.

    Django와 Django의 비동기 퀘스트 Q: 다음 단계는 무엇입니까?


    Django Q는 async_task 외에도 작업을 스케줄링할 수 있습니다.하나의 실제 용례는 X일에 한 번씩 X를 하는 것이다. 마치cron숙제와 같다.검사documentation to learn more.
    Django Q는 Redis를 제외한 다른 매니저를 지원합니다.다시 한 번 말하지만, 의사는 당신의 친구입니다.
    만약 Redis 이외의 다른 매니저가 필요하지 않다면, django-rq 아마도 Django Q의 경량급 대체품일 것이다.

    장고와 장고의 비동기 퀘스트 Q: 왜 미나리를 안 해요?


    재미있는 사실: 미나리는 내 친구가 만든 것이다.우리는 함께 고등학교에 다닌다.비록 나는 미나리 자체에 대해 경험이 별로 없지만, 나는 항상 많은 사람들이 그것을 불평하는 것을 듣는다.
    검사this out for a better perspective.
    읽어주셔서 감사합니다. 기대하세요!

    리소스

  • Django Q
  • Redis
  • What is message broker?
  • Background Jobs and Queueing
  • How to create a Django project from a template
  • 최초 출판 my blog

    좋은 웹페이지 즐겨찾기