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

Source: https://habr.com/ru/post/J123902/


All Articles