Django 에서 비동기 작업 의 django-celery 를 자세히 설명 합 니 다.

Celery 문서 참조:http://docs.jinkan.org/docs/celery/
https://www.jb51.net/article/158046.htm
Django 에서 비동기 작업
Celery 간단 한 소개:
celery 사용 필드:
  • 소모 퀘 스 트 정시 퀘 스 트
  • 요청 결과 별로 중요 하지 않 은
  • 소모 퀘 스 트 예 를 들 어 문자 인증 코드 를 보 내 면 우 리 는 먼저 고객 에 게 퀘 스 트 상태(요청 성공 또는 실패)
  • 을 보 낼 수 있 습 니 다.
  • 요청 결과 중요 한 건 의 는 django 를 사용 하여 실현 합 니 다.예 를 들 어
  • 지불
    먼저,Celery 는 강력 한 분포 식 작업 대기 열 로 작업 의 실행 을 주 프로그램 에서 완전히 벗 어 나 다른 호스트 에서 실 행 될 수 있 습 니 다.우 리 는 보통 그것 을 사용 하여 비동기 작업(asynctask)과 정시 작업(crontab)을 실현 합 니 다.그것 의 구 조 는 다음 과 같다.

    Celery 는 주로 다음 과 같은 몇 가지 모듈 을 포함 합 니 다.
    퀘 스 트 모듈 작업
    비동기 작업 과 정시 작업 을 포함 합 니 다.그 중에서 비동기 작업 은 보통 업무 논리 에서 작업 대기 열 로 동시 다발 되 고 정시 작업 은 Celery Beat 프로 세 스 가 주기 적 으로 작업 대기 열 로 보 냅 니 다.
    메시지 중간 부품 브로커
    Broker,즉 퀘 스 트 스케줄 링 대기 열 입 니 다.퀘 스 트 생산자 가 보 낸 메시지(즉 퀘 스 트)를 받 고 퀘 스 트 를 대기 열 에 저장 합 니 다.셀 러 리 자 체 는 대기 열 서 비 스 를 제공 하지 않 고 래 빗 MQ 와 레 디 스 등 을 공식 추천 합 니 다.
    작업 수행 단위 Worker
    Worker 는 작업 을 수행 하 는 처리 장치 로 메시지 대기 열 을 실시 간 으로 감시 하고 대기 열 에 있 는 작업 을 가 져 와 수행 합 니 다.
    작업 결과 저장 소 Backend
    Backend 는 조회 할 수 있 도록 작업 의 실행 결 과 를 저장 하 는 데 사 용 됩 니 다.메시지 미들웨어 와 마찬가지 로 저장 에 도 RabbitMQ,Redis,MongoDB 등 을 사용 할 수 있다.
    p>django-celery
    우선 사용 환경 을 통일 시 켜 야 합 니 다.redis 버 전이 너무 높 으 면 잘못 보고 할 것 이 라 고 생각 합 니 다.

    해결 방법:redis 버 전 을 낮 추 는 것 을 권장 합 니 다.
    추천 버 전
    Django == 2.2.6
    django-celery == 3.3.1
    django-redis == 4.11.0
    redis == 2.10.6
    celery == 3.1.26.post2
    의존 설치:pip install.... 명 이 다 알 고 있 습 니 다.
    1.setting.py django 프로필 을 수정 하고 다음 과 같이 추가 합 니 다.
    
    import djcelery ###  
    djcelery.setup_loader() ###
    BROKER_URL = 'redis://127.0.0.1:6379/2'
    # BROKER_URL='redis://192.168.217.77:16379/2' #     redis   ,     django server      
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' ### 
    INSTALLED_APPS = [
     ...
     "djcelery",	#   djcelery  
     ...
     
    ]
    CELERY_TIMEZONE='Asia/Shanghai' #       ,   TIME_ZONE    
    TIME_ZONE='Asia/Shanghai' #
    시작 부분 에 위의 설정 파일 을 추가 하고 실제 상황 에 따라 redis 의 주소 와 포트 를 설정 하 며 시간 대 는 반드시 Asia/Shanghai 으로 설정 해 야 합 니 다.그렇지 않 으 면 시간 이 정시 임무 의 운행 에 영향 을 주지 않 는 다.
    위의 코드 는 먼저 djcelery 모듈 을 내 보 내 고 setup 을 호출 합 니 다.loader 방법 으로 관련 설정 불 러 오기;시간 대 설정 에 주의 하 십시오.그렇지 않 으 면 기본적으로 UTC 를 사용 하 는 시간 이 동 8 구 보다 8 시간 느 립 니 다.그 중 INSTALLEDAPPS 말미 에 celery 서비스 와 자신 이 정의 한 apps 서 비 스 를 추가 하 는 것 을 나타 내 는 두 가지 항목 을 추가 합 니 다.
    2.Celery 에 필요 한 데이터 시트 만 들 기
    
    python manage.py migrate
    #               
    #python manage.py syncdb
    3.task 만 들 기

    stasks.py
    
    # -*- coding: utf-8 -*-
    import json, time
    from syl.settings import ALY_ACCESSKEY_ID, ALY_ACCESSKEY_SECRET
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.request import CommonRequest
    from celery import task
     
     
    #         
     
    @task
    def Celery_Send_Sms(phone, data):
     client = AcsClient(ALY_ACCESSKEY_ID, ALY_ACCESSKEY_SECRET, 'cn-hangzhou')
     request = CommonRequest()
     request.set_accept_format('json')
     request.set_domain('dysmsapi.aliyuncs.com')
     request.set_method('POST')
     request.set_protocol_type('https') # https | http
     request.set_version('2017-05-25')
     request.set_action_name('SendSms')
     request.add_query_param('RegionId', "cn-hangzhou")
     request.add_query_param('PhoneNumbers', phone)
     request.add_query_param('SignName', "    ")
     request.add_query_param('TemplateCode', "SMS_205397849")
     request.add_query_param('TemplateParam', data)
     response = client.do_action(request)
     time.sleep(10)
     print(str(response, encoding='utf-8'))
     res = json.loads(str(response, encoding='utf-8'))
     
    #celery    
    # python manage.py celery worker --loglevel=info
  • settings.py 의 djcelery.setuploader()가 실 행 될 때 Celery 는 모든 INSTALLED 를 볼 수 있 습 니 다.APPS 에서 app 디 렉 터 리 에 있 는 tasks.py 파일 은 task 로 표 시 된 function 을 찾 아 celery task 로 등록 합 니 다.
  • djcelery.setup 실행 중loader()시 task 는 INSTALLEDAPPS 의 app 이름,더하기.tasks.function등록
  • 번 impprt task 에 주의해 야 할 때 일치 하 는
  • 을 유지 해 야 합 니 다.
  • python path 가 다 르 기 때문에 다른 인용 방식 을 사용 할 때(예 를 들 어 tasks.py 에서 from my procject.my app.tasks import add 형식)Celery 는 같은 task 라 는 것 을 알 수 없 기 때문에 이상 한 bug 를 일 으 킬 수 있 습 니 다.
  • 임 무 를 비동기 로 만들다.
    예 를 들 어 저 희 는 사용자 가 request 를 보 낸 후에 이 task 를 비동기 로 실행 하고 즉시 response 로 돌아 가 이 request 를 막 지 않 고 사용자 로 하여 금 유창 한 방문 과정 을 가지 게 하 기 를 바 랍 니 다.그러면 저 희 는'delay'를 사용 할 수 있 습 니 다.

    views.py
    
    import re
    import random
    from rest_framework.permissions import AllowAny
    from django_redis import get_redis_connection
    from rest_framework.views import APIView
    from rest_framework.response import Response
    # from utils.MyBaseView import send_message, Send_Sms
    from verifications.stasks import Celery_Send_Sms
     
    #          
    class SmsCodeView(APIView):
     '''  apiview   '''
     # 1.        
     permission_classes = (AllowAny,)
     
     def post(self, request):
      # 1.     
      phone = request.data.get('phone') #    
      image_code = request.data.get('image_code') #       
      image_code_uuid = request.data.get('image_code_uuid') #      uuid, redis       key
     
      # 2.     
      if not all([phone, image_code, image_code_uuid]):
       return Response({'code': 400, 'msg': '    '})
     
      #          
      if not re.match(r'^1[3456789]\d{9}$', phone):
       return Response({"code": 999, "msg": "       "})
     
      # 3.       
      redis_client = get_redis_connection('img_code') #   redis   
      # phone_exists = redis_client.get(phone)
      # if phone_exists:
      #  return Response({"code": 999, "msg": "    ,      "})
     
      # 4.           
      redis_image_code = redis_client.get(image_code_uuid) #       
      if redis_image_code:
       # bytes    string
       redis_image_code = redis_image_code.decode() #  uuid  
     
      #               redis      
      if image_code.upper() != redis_image_code:
       return Response({'code': 999, 'msg': '        '})
      # 5.   
      code = '%06d' % random.randint(100000, 999999) #   6    
      print('code===============================================', code)
      #           
      # send_resp = send_message(phone, (code, "5"))
     
      #           
      data = {'code': code}
      # send_resp = Send_Sms(phone, data)
      #   celery      
      Celery_Send_Sms.delay(phone, data) #delay    celery        
      # Celery_Send_Sms(phone, data) # delay    celery        
     
      # 5.1   code   redis 
      redis_client.setex(phone, 60 * 5, code) # phone:code, 5     
      # 5.2  redis          ,        
      redis_client.delete(image_code_uuid)
     
      # 6.               ,      (  pipeline      )
      pl = redis_client.pipeline()
      pl.setex(phone, 60 * 5, code)
      pl.delete(image_code_uuid)
      pl.execute()
      # 7.     
      return Response({"code": 200, "msg": "      "})
    1.celery 시작
    먼저 django 작업 을 정상적으로 시작 한 다음 celery 서 비 스 를 시작 하면 됩 니 다.
    
    python manage.py celery worker --loglevel=info

    위의 그림 이 나타 나 면 슈퍼 관리자 가 시작 하지 못 하 게 하고 settings.py 에 다음 설정 을 추가 합 니 다.
    
    from celery import Celery, platforms
    platforms.C_FORCE_ROOT = True
    2.celery 퀘 스 트 검증
    위의 물건 을 처리 한 후에,당신 은 postman 을 통 해 인 터 페 이 스 를 celery 로 하여 금 다른 단계 로 임 무 를 수행 하 게 하고,당신 의 request 요청 을 막 지 않도록 요청 할 수 있 습 니 다.

    Django 의 비동기 임 무 를 자세히 설명 하 는 django-clery 에 관 한 글 은 여기까지 입 니 다.더 많은 Django 비동기 임무 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기