DjangoでCeleryを使用してタイミングタスクを実現(djceleryを使用)


一.引用
Djangoはpython言語の下で比較的人気のあるWebフレームワークであり、Djangoを使用して独自のWebサーバを実現する企業や開発者が増えている.Webサーバの開発過程では、Webサーバ側とユーザー側の簡単な論理的インタラクションを実現するだけでなく、いくつかのタイミングタスクを実現する場合があります.以下の例を挙げる.
  • Redisデータベースのレコードを定期的に削除またはキャッシュする より高いデータベースアクセス性能を追求するために、RedisをMySqlデータベースのキャッシュとして使用しました.通常アクセスしているデータをRedisに入れ、Mysqlに定期的に格納します.そして期限切れのRedisデータを削除します.その場合、このタスクをタイミングよく完了する必要があります.
  • レポートの生成    例えば、あなたはWeb電子商取引サーバーを持っていて、毎日ユーザーが上で買い物をしています.ユーザーごとの毎月の消費額を簡単に統計するために、データベースに月統計レポートを設計しました.その後、定時タスクを使用して、毎月の1日に統計を行い、データベースを取得し、ユーザーごとの先月の消費金額を計算し、月統計レポートに1つずつ格納します.では、このレポートを生成するタスクは、前に述べた毎月の1番で、タイミングよく完了します.
  • タイミング送信メッセージ また、あなたのサイトでユーザーの誕生日が来ると、彼の誕生日に、ユーザーのメールボックスに誕生日おめでとうの祝福を送りたいと思っています.これもタイミングタスクで実現されます.

  • これらの例は,いずれもタイミングタスクが必要である.Pythonでは、Celeryモジュールを使用してこのタスクを完了します.ネット上でCeleryの博文について多くて、大多博文の論理は比較的に混乱して、そのためこの博文がありました.読者にはっきりした認識を持って、そして良い実戦が出てくることを望んでいます.
    このブログでは、Broker、WorkerなどのCeleryの動作原理について説明していません.実戦の前に、これらの概念を理解しなければならない.ネット上にはすでにこのような内容がたくさんあるので、文章の終わりに参考文書を貼って、読者の勉強を便利にしました.
    二.celery,Django,Djcelery
    常に明確なのは、 CeleryはPythonのサードパーティ製ライブラリであり、Celeryを常に独立したモジュールと見なして他のモジュールを操作することができるため、任意のPythonのプロジェクトに使用することができます.したがって、Djangoプロジェクトで使用するCeleryも使用できますが、DjangoでCeleryを使用する方法は2つあります.
  • Celeryのみが使用されます.
  • Celery+djcelery.
  • を併用
    方法1:DjangoにCeleryのタスク・スクリプトが1つ追加されていることに相当します.Djangoのデータベースを操作するには、Djangoを操作するためにCeleryにDjango環境を追加で構成する必要があります.
    方法2:djceleryを使用することで、Djangoデータベースをタスクで簡単に直接操作でき、最終的なタスクはDjangoのバックグラウンドで関連するタスクを表示および変更できます.
    2つの方法の選択: 以上の説明から,方法1は方法2より1つのdjceleryモジュールを導入することが少なく,Djangoと結合した環境を独自に構成する必要があるという欠点がある.方法2は、比較的便利で安心し、Djangoのバックグラウンドで自分のタスクを管理することができます.だからDjangoでCeleryを使うなら、方法2を強くお勧めします.
    この2つの方法は私が相応の博文を書いた.このブログでは、djceleryを使用する方法2について説明しています.使用しないdjceleryがCeleryモジュールのみを使用する方法1については、私のもう一つのブログを参照してください. DjangoでCeleryを使用してタイミングタスクを実装(djceleryを使用しない)
    しかし、それらは本質的に同じです.
    三.Djangoディレクトリ構造
    Djangoプロジェクトのディレクトリ構造の例を次に示します. - app   - admin.py   - views.py   - urls.py   - models.py   - tasks.py - pro   - settings.py   - urls.py   - urls.py   - models.py - manage.py
    上記のディレクトリのtasks.pyファイルは私が新しく作成したもので、appのディレクトリの下に置いて、Celeryタスク全体で、私はこのファイルしか作成しませんでした.
    四.setting.pyの構成
    Celeryを設定するには、setting.pyファイルを次のように構成する必要があります.
    1.djceleryに参加する
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'djcelery', #       djcelery
        'app', )

    上記  INSTALLED_APPSの中で私は関係のないモジュールを省略して、djceleryに参加すればいいことに注意します.  
     
    2.celeryパラメータの設定
    setting.pyのファイルの最後に、次のceleryパラメータ構成を追加し、コードを貼ってから説明します.
    import djcelery
    djcelery.setup_loader()
    BROKER_URL = 'redis://127.0.0.1:6379/6'
    CELERY_IMPORTS = ('app.tasks', )
    CELERY_TIMEZONE = TIME_ZONE
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
    
    #           ,            . from celery.schedules import crontab CELERYBEAT_SCHEDULE = { #     :  24        (del_redis_data) u'     redis  ': { "task": "app.tasks.del_redis_data", "schedule": crontab(hour='*/24'), "args": (), }, #     :      12:30 ,    (back_up1) u'     ': { 'task': 'app.tasks.back_up1', 'schedule': crontab(minute=30, hour=0), "args": () }, #     :    1  6:00  ,    (back_up2) u'      ': { 'task': 'app.tasks.back_up2', 'schedule': crontab(hour=6, minute=0, day_of_month='1'), "args": () }, }

     
    上記のコードの意味:
    djcelery.setup_loader()が実行されると、CeleryはINSTALLD_を表示します.APPSに含まれるすべてのappディレクトリのtasks.pyファイルは、taskとマークされたメソッドを見つけてcelery taskに登録します.
    1.
    BROKER_URL = 'redis://127.0.0.1:6379/6'

     
    brokerは代理人で、workerにタスクを配布して実行します.私が使っているのはRedisをbrokerとして使っています.もちろん他のbrokerを使ってもいいです.例えば、公式にRabbitMQをお勧めします.
    一部のブログでは、キーワードの構成について説明しています:CELERY_RESULT_BACKEND、たとえば:
    CELERY_RESULT_BACKEND = 'amqp://guest@localhost//' #     

     
    私はこのキーワードを構成していません.構成されていない場合、Djangoはデフォルトのデータベース(あなたが指定したormデータベース)を使用し、その結果をbackendとします.そのため、書く必要はなく、Djangoのデフォルト設定のデータベースを使うといいです. 2.
    CELERY_IMPORTS = ('app.tasks', )
    CELERY_TIMEZONE = TIME_ZONE
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

     
    上記の第1文はインポート先のタスクファイルであり、第2文はタイムゾーンの設定であり、第3文はdjango-celeryのデフォルトのデータベーススケジューリングモデルを使用することを示し、タスク実行周期はデフォルトで指定されたormデータベースに存在する.
    より深いCelery構成:(http://www.cnblogs.com/ajianbeyourself/p/4950758.html) 3.
    from celery.schedules import crontab
    CELERYBEAT_SCHEDULE = {
        #     :  24        (del_redis_data)
        u'     redis  ': {
            "task": "app.tasks.del_redis_data", "schedule": crontab(hour='*/24'), "args": (), },

     
    上記はタイミングを設定する時間構成で、crontabの使い方について、公式のドキュメントの説明は非常に詳細です(ドキュメントの末尾の表):
    http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
    5.Tasksタスク
    各タスクは本質的に関数であり、tasks.pyで実行したい関数を書き込むとよい.私のtasks.pyは以下の通りです:私が書いたすべての任務は臭いし、長いので、具体的な詳細は省略します.
    # coding=utf-8
    from celery import task
    
    @task()
    def del_redis_data(): #        redis     。     @task() def back_up1(): #               。     @task() def back_up2(): #               。    

     
    読者が自分でタイミングタスクを実現する必要がある場合、上記のtask関数は必ず自分で定義しなければならないので、参考にしました.私の上の3つのタスクは、setting.pyファイルのCELERYBEAT_SCHEDULEの3つのタイミング構成に対応しています.
    タスクは関数にすぎません.この関数はいつ呼び出されるかは、setting.pyの構成によって異なります.
    6.タイミングタスクの開始
    続行: Djangoバックグラウンドにログインすると、
    7.推薦文
    1.より深いCelery構成:(http://www.cnblogs.com/ajianbeyourself/p/4950758.html)
    転載先:https://www.cnblogs.com/wumingxiaoyao/p/8521567.html