.Djangoで要求
応答を得るために1から開始されたDjangoのウェブhttpリクエストは、htmlページ・プロセスを返し、次のとおりです。
httpリクエストが開始します
ミドルウェアの後
HTTP(リクエストを解析)の取り扱い
URLマッピング(URL一致がビューに対応する発見されました)
ビューのロジック(含む追加と削除Modelクラスが変更されたデータベース検索を呼び出します)
ミドルウェアの後
対応するテンプレート/レスポンスを返します。
同期要求:すべてのロジックの処理、応答ビューのデータコンピューティングタスクを処理した後に戻りました。ページまで待ち状態のタスクを処理する際の表示ユーザーが結果を返します。
非同期リクエスト:最初のリターン応答を表示して、バックグラウンド処理タスクインチ ユーザーがサイトを閲覧し続けることができ、待つ必要はありません。タスク処理が完了すると、私たちは、ユーザに知らせることができます。
二.Djangoはセロリを使用します
インストール
PIP3ジャンゴ・セロリをインストール
コンフィギュレーション
次のように最初のDjangoプロジェクトを作成して構成されています。
別の兄弟ディレクトリがceleryconfig.pyプロファイルを追加のsettings.pyした後、設定情報の詳細は、公式ドキュメントを参照することができます。
インポートdjcelery から日時インポートはtimedelta djcelery.setup_loader() #导入任务 CELERY_IMPORTS = [ ' celeryapp.tasks ' ] #设置队列 CELERY_QUEUES = { ' beat_tasks ' {: ' 交流':' beat_tasks ' 、 ' EXCHANGE_TYPE ':' 直接' 、 ' binding_key ':" beat_tasks' }、 ' Work_queue ' :{ ' 交流':' work_queue ' ' EXCHANGE_TYPE ':' 直接' ' binding_key ':' work_queue " } } #デフォルトのキューを設定し、キューはデフォルトキューに他のタスクを満たしていない CELERY_DEFAULT_QUEUE = ' work_queue '#いくつかの例には、デッドロックを防ぐことができ CELERYD_FORCE_EXECV = 真#同時の数を設定し CELERYD_CONCURRENCYを。4 = # 漏れメモリ防止するために、100まで実行する各ワーカータスク CELERYD_MAX_TASKS_PER_CHILDは= 100 #シングルタスク実行時間までは CELERYD_TASK_TIME_LIMIT * = 12は、30である#タイミング行わ設定する CELERYBAET_SCHEDULE = { 「タスク1 」{: 「タスク」:「コースタスク」、 ' スケジュール':はtimedelta(= 5秒。)、 ' オプション' :{ ' キュー':' beat_tasks ' } } } CELERY_ACCEPT_CONTENT = [ ' 漬物'、' JSON ' 、] BROKER_BACKEND = ' Redisの' BROKER_URL = ' のRedis:// localhostを:1分の6379 ' CELERY_RESULT_BACKEND = ' のRedis:// localhostを:2分の6379 '
.celeryconfig インポート * #导入セロリ配置信息 INSTALLED_APPS = [ ' django.contrib.admin ' 、 ' django.contrib.auth ' 、 ' django.contrib.contenttypes ' 、 ' django.contrib.sessions ' 、 " django.contrib。メッセージ' ' django.contrib.staticfiles ' ' celeryapp.apps.CeleryappConfig ' ' djcelery "#サインセロリ ]
インポート時 から celery.taskのインポートタスク クラス:コース(タスク) 名 = ' もちろん、タスク' DEF実行(自己、* argsを、** kwargsから): プリント(' スタート... ' ) time.sleep( 3 ) 印刷(F ' 引数の引数= {}、kwargsから= {kwargsから} ' ) プリント(' 末端タスク.... ')
django.http インポートjsonResponse から celeryapp.tasks インポートコース、 DEFコース、(要求、* argsを、** kwargsから): #非同期タスクを実行する 印刷(" スタートコース、... " ) #Course.delay() #はapply_async転送を使用することができますパラメータは、キューを指定 Course.apply_async(引数=(' こんにちは'、)、キュー= ' work_queue ' ) を印刷(" コースを終了しますが... " ) を返す jsonResponse({ " の検索結果を':' OK " })
django.contribのインポート管理者 から django.urls インポート経路 から celeryapp.views インポートコース urlpatterns = [ パス(' 管理/ ' 、admin.site.urls)、 パス(' コース/ ' 、コース) ]
Redisのは、メッセージブローカとして開始しました
Djangoプロジェクトを訪問し、その後、開始8000 /コース、/:// localhostを:HTTPを、タスクをトリガー
python manage.pyのrunserver
スタートワーカー
python manage.pyセロリワーカー-l情報
あなたは任務の設定と実装を表示することができます:
スタートビート
python manage.pyセロリは-l情報を倒します
III。一般的なエラー
♦ AttributeError: ‘str’ object has no attribute ‘items’
解决方法: redis版本过高,降低redis版本即可
pip install redis==2.10.6
♦ from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger SyntaxError: invalid syntax
这个是python3.7目前不支持kombu,降低python版本至3.6即可,可以使用conda进行直接安装
conda install python=3.6.8
四.过程监控
Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现。
安装监控
pip install flower
执行flower
python manage.py celery flower
本地端口:5555查看监控
刷新course页面,查看tasks,发现有刚刚执行完成的任务
查看broker
进入Monitor查看任务执行情况,执行成功,执行失败,消耗的时间,队列里面的任务情况
点击的worker查看具体worker情况
可以给flower添加密码认证,添加之后再访问则需要输入用户名和密码
python manage.py celery flower --basic_auth=username:password