Djangoでceleryを使用してメール/情報送信タスクを分散処理

8334 ワード

https://liboer.top/articles/detail/celery-use-django/
Celery分散処理
djangoブログでメールサーバを構成すると、ユーザーからコメントが来た場合、メールアラートが送信されます.メールを送信するときにメールの向こうが詰まったり、数秒詰まったりするとdjangoが詰まったり、djangoがサービスできないか、特に時間がかかります.
生産者消費者モデル
djangoはメールをredisのリストに送って、彼に送ってもらいました.
Celeryは,分散型のタスクイベントの処理を実現できる.リアルタイム処理に専念するタスクキューであり、タスクスケジューリングもサポートされます.
インストール
pip3 install celery

broker-メッセージ伝送のミドルウェアで、生産者がメッセージを送信するとbrokerに送信されます.
backend-メッセージ/タスク結果の格納に使用
worker-作業者、消費/実行brokerにおけるメッセージ/タスクのプロセス
celeryを使用するかどうか:ブロックが発生しているかどうかは、リアルタイムの応答ができません.
使用
#   worker
# task.py  
from celery import Celery
# app = Celery('libo', broker='redis://:[email protected]:6379/1')
app = Celery('libo', broker='redis://:@127.0.0.1:6379/1')  #    
#       


@app.task
def task_test(a, b):
    print("task is running...")
    return a+b

#   worker
#  task.py         
# celery -A tasks worker --loglevel=info
#           ,           

#      
# from task import task_test
# task_test.delay()

きおく
Celeryのストレージにはredisまたはmysqlが必要です
from celery import Celery
# app = Celery('libo', broker='redis://:[email protected]:6379/1')
app = Celery('libo', 
             broker='redis://:@127.0.0.1:6379/1',
            backend='redis://:@127.0.0.1:6379/2')  #    
@app.task
def task_test(a, b):
    print("task is running...")
    return a+b
#      
# from task import task_test
# s = task_test.delay(10, 100)
# s.result

Djangoでのceleryの使用
  • celeryプロファイル項目を作成する同名ディレクトリの下でceleryを作成する.py
  • アプリケーションの下でtasksを作成する.pyセット定義対応worker関数
  • ビュー関数は、生産者として機能し、特定のworker関数
  • をプッシュする.
  • プロジェクトディレクトリの下でworker celery-Aプロジェクトの同名ディレクトリ名worker-l info
  • を起動
    # celery.py setting.py     
    from celery import Celery
    from django.conf import settings
    import os
    
    # linux         
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'BlogLee.settings')
    
    app = Celery('bloglee')
    app.conf.update(
        BROKER_URL='redis://:@127.0.0.1:6379/1',
    )
    
    #       app     worker  
    app.autodiscover_tasks(settings.INSTALLED_APPS)
    
    
    # tasks.py         
    from django.core.mail import send_mail
    from BlogLee.celery import app
    
    
    @app.task
    def my_send_mail(title, email_content, email_from, email_to):
        send_mail(title, email_content, email_from, email_to)
    
        
        
    # views.py          
    my_send_mail.delay(
          title,
          email_content,
          settings.EMAIL_HOST_USER,
          email_to,  #       
    )
    
    
    
    #            worker
    nohup celery -A /mydata/BlogLee/BlogLee worker -P gevent -c 1000 > celery.log 2>&1 &
    # nohup:        ,  ,         
    # -P gevent -c 1000       1000 
    # > celery.log        
    # 2>&1                 print  
    # &: