ほとんどのDjango開発者は非同期タスク実行システムであるCeleryを聞いたことがあると思います。
約1年前、ハブでセロリの使用方法について説明した良い記事がありました。 ただし、結論で述べたように、ceelery 2.0はすでにリリースされており(2.2.7が現在安定版です)、djangoとの統合が別のパッケージに移動され、 その他の変更が行われています 。
この記事は、主にDjangoの使用を開始する初心者に役立ちます。また、システムで非同期および/または定期的なタスクを実行できるもの(たとえば、古いセッションのクリーンアップ)が必要です。 Celeryをインストールして構成し、Djangoと最初から最後まで機能する方法、およびその他の便利な設定と落とし穴を紹介します。
まず、システムにpython-setuptoolsパッケージが存在するかどうかを確認し、存在しない場合はインストールします。
aptitude install python-setuptools
セロリのインストール
Celery自体のインストールは非常に簡単です。easy_install Celery
オリジナルの詳細: http : //celeryq.org/docs/getting-started/introduction.html#installation
最初に与えられたリンクであるMongoDBがバックエンドとして使用された記事では、他のDjangoアプリケーションがデータを保存するバックエンドおよびメッセージブローカーと同じデータベースを使用する方法を示します。
ジャンゴセロリ
django-celeryパッケージをインストールします 。easy_install django-celery
すでに述べたように、 django-celeryはCeleryとDjangoの便利な統合を提供します。 特に、 Django ORMをバックエンドとして使用してCeleryジョブを保存し、 INSTALLED_APPSにリストされているDjangoアプリケーションのCeleryジョブを自動的に検索してログに記録します。
django-celeryをインストールしたら、次を設定する必要があります。
- djceleryをINSTALLED_APPSリストに追加します。
INSTALLED_APPS += ("djcelery", )
- django設定ファイル{{settings.py}}に次の行を追加します。
import djcelery djcelery.setup_loader()
- データベースに必要なテーブルを作成します。
./manage.py syncdb
- データベースを定期的なタスクの保存場所として設定し、 settings.pyに追加します 。
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
このオプションを使用すると、django管理パネルから定期的なジョブを追加/削除/編集できます。
mod_wsgiを使用する場合、 WSGI構成ファイルに次の行を追加します。
import os os.environ["CELERY_LOADER"] = "django"
ジャンゴ昆布
Celeryに適したメッセージブローカーを見つける必要があります。この記事では、DjangoデータベースをKombu(PythonのAMPQ実装)のメッセージストアとして使用できるパッケージdjango-kombuを使用します。パッケージをインストールします。
easy_install django-kombu
カスタマイズ:
- djkombuをINSTALLED_APPSリストに追加します。
INSTALLED_APPS += ("djkombu", )
- settings.pyでdjkombuをブローカーとして設定します :
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
- データベースに必要なテーブルを作成します。
./manage.py syncdb
打ち上げ
セロリとセロリビートのプロセスを開始します。(celerybeatを使用しなくても、定期的なタスクを開始および実行できます。Celerybeatは、スケジュールされたスケジュール済みタスクに対して実行する必要があります)
- Linuxでは、両方のプロセスを-Bスイッチで同時に開始できます。
# ./manage.py celeryd -B -------------- celery@test v2.2.7 ---- **** ----- --- * *** * -- [Configuration] -- * - **** --- . broker: djkombu.transport.DatabaseTransport://guest@localhost0/ - ** ---------- . loader: djcelery.loaders.DjangoLoader - ** ---------- . logfile: [stderr]@WARNING - ** ---------- . concurrency: 16 - ** ---------- . events: OFF - *** --- * --- . beat: ON -- ******* ---- --- ***** ----- [Queues] -------------- . celery: exchange:celery (direct) binding:celery
- Windowsでは、セロリとセロリビートを個別に実行する必要があります。
./manage.py celeryd --settings=settings ./manage.py celerybeat
次の例外が発生した場合、 -settingsオプションが必要になる場合があります。
ImportError: Could not import settings 'app_name.settings' (Is it on sys.path?): No module named app_name.settings
問題の詳細: http : //groups.google.com/group/celery-users/browse_thread/thread/43a95be6865a636/d91ab2492885f3d4?lnk=gst&q=settings#d91ab2492885f3d4
Windows上のセロリに関する既知の問題の完全なリスト: http : //celeryproject.org/docs/faq.html#windows
開始後、django管理パネルで定期的なタスクの様子を確認できます。
Django ORM以外(RabbitMQなど)をセロリバックエンドとして使用する場合、Django管理パネルで他のすべてのタスクのステータスも表示できます。これは次のようになります。
詳細: http : //stackoverflow.com/questions/5449163/django-celery-admin-interface-showing-zero-tasks-workers
更新:私は悪魔について少し追加しています。それは最初はうまくいかないかもしれないからです。
セロリをサービスとして実行する
ここからセロリ起動スクリプトをダウンロードします: https : //github.com/ask/celery/tree/master/contrib/generic-init.d/を適切な権限で/etc/init.dディレクトリに配置します。/ etc / default ディレクトリで、 celerydファイルを作成します。 このファイルからスクリプトが起動設定を取得します。
# Where the Django project is. CELERYD_CHDIR="/var/www/myproject" # Path to celeryd CELERYD_MULTI="$CELERYD_CHDIR/manage.py celeryd_multi" CELERYD_OPTS="--time-limit=300 --concurrency=8 -B" CELERYD_LOG_FILE=/var/log/celery/%n.log # Path to celerybeat CELERYBEAT="$CELERYD_CHDIR/manage.py celerybeat" CELERYBEAT_LOG_FILE="/var/log/celery/beat.log" CELERYBEAT_PID_FILE="/var/run/celery/beat.pid" CELERY_CONFIG_MODULE="settings" export DJANGO_SETTINGS_MODULE="settings"
--concurrencyオプションは、セロリプロセスの数を設定します(デフォルトでは、この数はプロセッサの数に等しくなります)。
その後、 serviceを使用してセロリを開始できます :
service celeryd start
詳細: docs.celeryproject.org/en/latest/tutorials/daemonizing.html#daemonizing
セロリを扱う
django-celeryをインストールすると、 INSTALLED_APPSにリストされているすべてのアプリケーションのすべてのtasks.pyモジュールからセロリジョブが自動的に登録されます。 タスクモジュールに加えて、 CELERY_IMPORTSパラメーターを使用して追加のモジュールを指定することもできます。 CELERY_IMPORTS=('myapp.my_task_module',)
また、 CELERY_SEND_TASK_ERROR_EMAILSオプションをアクティブにすることも役立ちます。これにより、 Celeryは、 ADMINS変数にリストされているアドレスへのすべてのエラーを通知します。
セロリの課題を書くことは、前の記事からあまり変わっていません。
from celery.task import periodic_task from celery.schedules import crontab @periodic_task(ignore_result=True, run_every=crontab(hour=0, minute=0)) def clean_sessions(): Session.objects.filter(expire_date__lt=datetime.now()).delete()
唯一の違いは、デコレータをcelery.taskからインポートする必要があることです。 デコレータモジュールは非推奨になりました。
いくつかのパフォーマンスノート:
- タスクが結果を返さない場合は、 ignore_result = Trueオプションを設定することをお勧めします
- タスクがそれらを使用しない場合、 レート制限をオフにします。
CELERY_DISABLE_RATE_LIMITS = True
これらおよびその他のCeleryのヒントの詳細: http : //celeryproject.org/docs/userguide/tasks.html#tips-and-best-practices