I.はじめに
DjangoはPython言語の下で、より一般的なWebフレームワークは、ジャンゴを使用して、より多くの企業や開発者が独自のWebサーバーを実装しています。Webサーバーの開発プロセスでは、時々、私たちは単純な論理インタラクティブなWebサーバとクライアントを実装するために、だけでなく、いくつかの定期的なタスクを達成したいです。例としては次のものがあります。
-
定期的に削除またはレコードキャッシュRedisのデータベース
より高性能なデータベースアクセスを追求するために、キャッシュMySQLデータベースとしてIのRedis。多くの場合、データは、タイミング記憶にRedisの次に、MySQLでのアクセス。そして、Redisのデータの有効期限は削除します。したがって、この時間は、私たちは、このタスクを完了するために、タイミングを必要としています。 -
レポートの生成
アナロジーを、Webサーバーの電力供給を持って、毎日のユーザーがトップで買い物をします。簡単に月額ユーザーあたりの消費量をカウントするためには、あなたは、データベース内の月次統計レポートを設計しました。そして、店舗ごと月次統計レポート、先月、各ユーザの消費量を計算するために定期的なタスク、各月の1日の統計、検索可能なデータベースを使用します。、今月に述べた第1である、このミッションの報告書は、完了するまでの時間です。 -
メッセージの送信
別の例:あなたの誕生日は、ウェブサイトのユーザーを来て、あなたはハッピーバースデーの願いを送信するために、ユーザーのメールボックスに、彼の誕生日にしたいです。だから、これは達成するためにスケジュールされたタスクです。
上記の例では、タイミングタスクが必要とされています。Pythonでは、私たちは、このタスクを完了するために、セロリのモジュールを使用しています。ボーエン、混乱ボーエン最も論理的なビットの多くのネットワーク上のセロリので、このブログがありました。私は読者が読みの明確な理解を持っていることを望みますし、良い戦闘が、それは、もはやセロリ、通常の作業上の任意の混乱はありません、これはこのブログの私の本来の意図です。
ブログの記事は、そのようなので、上のブローカー、労働者として、原則セロリを紹介しませんでした。戦闘前に、これらの概念を明確に理解する必要があります。インターネットは、そのようなコンテンツをたくさんされているように、私は読者が学ぶことができるように記事の最後にいくつかの参考資料を掲載しました。
二.Celery、Djangoの和Djcelery
それは、常に明確である:
私たちは常に他のモジュールを操作するための独立したモジュールとしてセロリを置くことができるので、セロリは、Pythonのプロジェクトのいずれにも使用することができ、サードパーティのPythonライブラリです。したがって、我々は、Djangoプロジェクトのセロリを使用することができますが、Djangoの2つの方法で、セロリの使用ことは注目に値します。
- 唯一のセロリを使用してください。
- セロリ+のdjceleryを使用してください。
方法1:ジャンゴを操作するために、タスクのスクリプトセロリを追加するDjangoの同等、Djangoの環境、したがって、Djangoのデータベースを操作するために、セロリで追加の設定が必要です。
方法2:使用djceleryに起因して、容易にタスクDjangoのデータベース内で直接動作することができ、最終的なタスクは、Djangoのバックエンドデータベースに関連するタスクを表示および変更します。
二つの方法の選択:
上記の説明からモジュールを導入djcelery未満方法1方法2を参照し、それ自身の欠点がDjangoの環境に関連して配置されている必要があります。方法、心のより便利な平和でなく、バックグラウンドジャンゴで自分のタスクを管理します。あなたはジャンゴとセロリを使用するのであれば、私は強く方法2をお勧めします。
ブログの記事は、2の使用を記載するが、それらの両方は、本質的に同じです。私は、「(djceleryない)Djangoのセロリはタイミングタスクを達成するために使用される、」私はもともと(約1)ボーエンにコンパニオン作品を書くために計画され、そして良い名前をしたい、と呼ばれていた、二つの方法で実施しています。しかし、それ以降も、コンパニオン計画が棚上げされていますので、面倒誰が、他の要素と一緒に、更新しないと、その後疎外Djangoのバックエンドを残していることを書きました。この記事は、もともといくつかの良いフィードバックを受け、その後、上記CSDNに出版された、このブログは再び更新します。(ただし、コンパニオンプログラムがあったか、または私はあきらめました)。
チャットの時間が終了した、次のようにテキストです。
三。Djangoのディレクトリ構造
まず、覚えている:ジャンゴ・セロリをインストールPIP
次の例では、Djangoプロジェクトのディレクトリ構造を示しています。
- アプリ
- admin.py
- views.py
- urls.py
- models.py
- tasks.py - プロ
- settings.py
- urls.py
- urls.py
- models.py - manage.py
上記のディレクトリのことに注意してくださいtasks.py
ファイルは、全体セロリタスクの下のディレクトリアプリに置かれ、私の新しいのですが、私はこの1つだけのファイルを構築しました。
IV。設定setting.py
セロリを設定するために、我々は次のように、setting.pyファイルを設定する必要があります。
1. djcelery追加
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'djcelery', #此处是新加入的djcelery
'app', )
上記の INSTALLED_APPS
、私は注意を追加し、関係のないモジュールを省略djcelery
します。
djceleryを追加した後、移行を移行し、実装するデータテーブルを生成する必要があります。
2.パラメータの設定セロリ
私はsetting.pyファイルの終わりだ、セロリの次のパラメータの設定を追加し、最初に説明するためのコードを掲載しました。
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()が実行時に、セロリはtasks.py appディレクトリINSTALLD_APPSが含まれるすべてのファイルを表示するために行くときに、タスク・アプローチのためのマークを見つけ、彼らはセロリのタスクとして登録されます。
BROKER_URL = 'redis://127.0.0.1:6379/6'
ブローカーは、実行する作業員にタスクを配布する責任がある薬、です。私は公式がよりRabbitMQのを使用することが推奨されているような、もちろん、あなたはまた、他のブローカーを使用することができ、ブローカーとしてのRedisを使用しています。
いくつかは、ブログのキーワードを設定する必要性に言及した:CELERY_RESULT_BACKEND
例えば:
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//' #可以不用写
私は、このキーワードを設定する必要はありません。設定されていない場合、Djangoはデフォルトのデータベースを使用しますので、そのバックエンドとしてその結果として、(あなたはまた、データベースのORMを指定します)。あなたが書くことができないので、デフォルトの設定を使用してDjangoのデータベースは非常に良いです。
CELERY_IMPORTS = ('app.tasks', )
CELERY_TIMEZONE = TIME_ZONE
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
上述した第2文がゾーンに設定され、デフォルトのデータベースジャンゴ - セロリスケジューリングモデルの3番目の文の表示、タスクの実行期間をデフォルトのORMプレゼンスデータベースによって指定され、特定のタスクファイルの導入です。
セロリより詳細な構成:(http://www.cnblogs.com/ajianbeyourself/p/4950758.html)
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
私は3つのタスク、私は意図的に選んだ、非常に代表を選びました。最初は、周期的タスクは、そのような各時点毎に1分毎に1時間、等;第二及び第三のタスクが計時され、タイミングとして、時間の一定期間毎のそれぞれのタスクを実行することですこのような一日あたり6:00、または1ヶ月タイミングとして。
定期的なタスクとタイミングタスクのcrontabの力で小さな違いが、それは両方をサポートしています。
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(): # 此处是一个生成统计报表的操作。具体略过
読者はタイミングタスクを自分で実装する必要がある場合は、上記の課題は、私は、参照のみを提供することができ、関数を定義する必要がバインドされています。私のトップ3つのタスクは、対応するsetting.py
ファイルCELERYBEAT_SCHEDULE
3つのタイマー設定の。
タスクがあなたに応じて、ときに関数呼び出しだけの関数であることに注意してくださいsetting.py
設定。
6.スケジュールされたタスクを開始します
Djangoは、バックグラウンドにログインあなたはバックエンドのデータベースが一時的に少しそのタスクパラメータ、レンダリングを明らかに見ることができます。
次に、ルートディレクトリのDjangoプロジェクトへの切り替え、ターミナルを起動し実行します。
python manage.py runserver # 启动web服务
python manage.py celery worker -l info # 启动celery woker
このコマンドは労働者、労働者の本質にタスクを実行するスレッドを起動するために使用され、ドラッジの労働者です。
python manage.py celery beat
-l info
# 启动beat, 执行定时任务.(原博客在此处有错误,已经修改。提示:最新的django-celery匹配celery<4.0,>=3.1.15版本。)
このタスクの上にビーターを有効にすることです、それは労働者に配布タスクを担当するリーダー、のようなものです。
指示するために、このブログは、以上の基本的に2つの更新時間の長い間隔に起因して、最初のアイデアを覚えています。もちろん、あなたは確かに重要な質問があり、そのタスクは、システムが再起動されるため、または他の原因がクラッシュした場合どのようにそれを再起動するのですか?Linuxシステムの場合は、監督者は、タスクが起動および実行されていない場合、それは我々が何らかの理由で出てクラッシュしないため、サーバー側での定期的なタスクを保証することができるように、自分のタスクを開始する再起動することができ、これらの2つのコマンドをホストすることができます。
7.おすすめ記事
1セロリより詳細な構成:(http://www.cnblogs.com/ajianbeyourself/p/4950758.html)