falsk使用セロリのバックグラウンドタスク

#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、デシベルから

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

次に、効果を確認することができ、適切なアドレスへのアクセスをフラスコを実行します。

おすすめ

転載: www.cnblogs.com/wodeboke-y/p/11600946.html