Celeryを使用したDjangoの非同期ジョブ

ご挨拶!

ほとんどの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をインストールしたら、次を設定する必要があります。



mod_wsgiを使用する場合、 WSGI構成ファイルに次の行を追加します。

 import os os.environ["CELERY_LOADER"] = "django"
      
      







ジャンゴ昆布

Celeryに適したメッセージブローカーを見つける必要があります。この記事では、DjangoデータベースをKombu(PythonのAMPQ実装)のメッセージストアとして使用できるパッケージdjango-kombuを使用します。

パッケージをインストールします。

 easy_install django-kombu
      
      





カスタマイズ:



打ち上げ

セロリとセロリビートのプロセスを開始します。

(celerybeatを使用しなくても、定期的なタスクを開始および実行できます。Celerybeatは、スケジュールされたスケジュール済みタスクに対して実行する必要があります)



開始後、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からインポートする必要があることです。 デコレータモジュールは非推奨になりました。



いくつかのパフォーマンスノート:



これらおよびその他のCeleryのヒントの詳細: http : //celeryproject.org/docs/userguide/tasks.html#tips-and-best-practices



All Articles