#Falskはセロリのバックグラウンドタスクを使用します
構築する1. Basic環境
DOCます。https://flask.palletsprojects.com/en/1.0.x/patterns/celery/
mkdir celery_tasks
初期化の.py#インスタンス化セロリ
セロリのインポートセロリから #セロリ my_celery =セロリ(「my_celery」)
task_1.py#セロリタスク
celery_tasksからmy_celeryインポート @ my_celery.task :デフadd_together(a、b)は #print( 'add_together执行中は...') + bを返します
アプリ.__ init__#セロリインスタンス構成
.APP輸入create_app、デシベルから
.APP輸入create_app、デシベルから
flask_app = create_app()
celery_tasksインポートmy_celeryから
の.appインポート_handle_celery_taskのから
_handle_celery_task(flask_app、my_celery)
設定位置app.app.py
:DEF(APP、my_celery)_handle_celery_task #セロリ my_celery.conf [ 'broker_url'] = 'のRedis://:[email protected]:6379/0' my_celery.conf [ 'result_backend'] =「Redisの://を: [email protected]:6379/0' my_celery.conf [ '輸入'] = [ 'celery_tasks.tasks_1'] celery.taskインポートタスクから クラスContextTask(タスク): DEF ON_SUCCESS(自己、RETVAL、TASK_ID、引数、kwargsから): プリント( '行わタスク:{0}。フォーマット(RETVAL)) リターンスーパー(ContextTask、自己).on_success(RETVAL、TASK_ID、引数、kwargsから) DEF on_failure(自己、EXC、TASK_ID、引数、kwargsから、EINFO ): プリント(「タスク失敗の理由:{0}。フォーマット(EXC)) リターンスーパー(ContextTask、自己).on_failure(EXC、TASK_ID、引数、kwargsから、EINFO) デフ__call __(自己、* argsを、** kwargsから): 印刷:( '应用名'、app.name) app.app_contextと(): プリント(app.route) リターンself.run(* argsを、** kwargsから) my_celery.Task = ContextTask
バックグラウンドタスクのステータスの更新2.
仕事
@ celery.task(バインド=真) デフlong_task(自己): 「」「進捗報告で長い機能を実行するバックグラウンドタスク。」「」 動詞= [「起動」、「起動」、「修復」、「ロード」、 『確認』] 形容詞= [ 『『 『マスター』、 『放射』、』サイレント高調波』、 『速い』] 名詞= [ 『太陽電池アレイ』、 『粒子整形』、 『宇宙線』、 『人工衛星』 、 'ビット'] メッセージ= '' の合計= random.randint(10、50) の範囲内のiについて(合計) しない場合、メッセージまたははrandom.Random()<0.25: メッセージ=「{0} {1} {2 } ... '。フォーマット(random.choice(動詞)、 random.choice(形容詞)、 random.choice(名詞)) self.update_state(状態= 'PROGRESS'、 =メタ{ 'カレント':I、 '総':合計、 'ステータス':メッセージ}) time.sleep(1) リターン{ '現在の' 100、 '総': 100、 'ステータス': 'タスク完了!'、 '結果':42}
ルート
@ app.route( '/ celery_1'、メソッド= [ 'GET'、 'POST']) デフcelery_1(): もしrequest.method == 'GET': リターンrender_template( 'celery_t.htmlを') @ app.route ( '/ longtask'、メソッド= [ 'POST']) DEF longtask(): タスク= long_task.apply_async() jsonify返す({})、202、{ '場所':なurl_for( 'taskstatus'、 TASK_ID =タスク。 ID)} @ app.route( '/ステータス/') DEF taskstatus(TASK_ID): タスク= long_task.AsyncResult(TASK_ID) task.state場合== 'PENDING': #ジョブがまだ開始されなかった = {応答 '状態':task.state、 'カレント':0、 '総':1、 'ステータス': '保留...' } !のelif task.state = 'FAILURE': 応答が= { '状態':task.state、 'カレント':task.info.get('「現在、0)、 '合計':task.info.get( '合計'、1)、 'ステータス':task.info.get( 'ステータス'、 '') } task.info.get( '状態'、 '') task.infoであれば'結果': 応答[「結果」] = task.info [「結果」] 他: #何かがバックグラウンドジョブで間違っていた = {応答 、task.state:「状態」 「現在の」:1 、 '総' 1は、 'ステータス':STR(task.info)、#これは、発生する例外である } jsonifyリターン(応答)
celery_1.html
コードセグメントは、長すぎる、この記事、リンクアドレスの焦点ではありません:
https://github.com/miguelgrinberg/flask-celery-exampleは
/ AJAX経由で簡単にノンストップのアクセス/ステータスです
3.ファイル名を指定して実行
(Venv)>アプリケーションワーカー情報-lセロリ-A -P eventlet
--logfile = c.log
コマンドはセロリが、それ以外の場合はnullをレジスタタスクセロリを与えるモジュール尖った構成例でなければならないことに注意してください。
可以看到タスク列表
[タスク]
。app.app.ContextTask
。celery_tasks.tasks_1.add_togethe
。celery_tasks.tasks_1.long_task
次に、効果を確認することができ、適切なアドレスへのアクセスをフラスコを実行します。