Flask의 Celery 비동기 처리

13882 단어 파이썬CeleryFlask
 

소개



Flask에서 간단한 파이썬 애플리케이션을 만들었습니다. 그래서 비동기 처리를 추가하고 싶습니다.
하지만 거기서 몇 가지 막힐 포인트가 있었기 때문에 기사로 했습니다.
첫째, 앞서 말할 수있는 것은 파이썬에서의 비동기 처리는 Flask가 아닌 프레임 워크가 더 좋을 수 있다는 것입니다. 구그하고 있으면 다른 프레임워크 쪽이 정보가 많이 느꼈습니다.

실행 내용



사용자가 텍스트 상자에 두 개의 숫자를 입력하고 버튼을 누릅니다.
서버측은 2개의 숫자를 더하는 조작을 비동기 처리로 실시해, 유저에게의 응답을 곧바로 돌려준다.

실행 환경



os: Windows10
redis Redis-x64-3.0.504.msi

파이썬 3.5.6 (아나콘다)
Flask==1.1.1
celery==3.1.25
redis==2.10.6

실행 절차


  • Anaconda Prompt에서 'python sample.py'를 실행합니다.
  • Anaconda Prompt에서 "celery -A sample.celery worker -l info"를 실행합니다.
  • localhost : 9000으로 이동하여 텍스트 상자에 숫자를 입력하고 계산 실행을 누릅니다.
  • 결과적으로 즉시 응답이 반환됩니다. celery를 실행한 Anaconda Prompt에 계산 결과가 표시되는지 확인합니다.

  • 이마즈키 포인트


  • celery와 redis의 버전에는 궁합이 있으므로 우선은, 이것들을 확인한다.
  • redis가 localhost:6397에서 움직이고 있는지 확인한다.
  • 비동기 처리할 함수가 cellery task에 등록되어 있는지 확인합니다.
    ( "celery -A sample.celery worker -l info"를 실행 한 터미널에서 확인 가능)

  • 결론



    간단하지만 아래에 sample.py, main.html을 첨부했습니다. 이 두 파일로 이동합니다. 참고로 한 사이트의 URL도 첨부해 두었습니다.

    뭔가 질문, 실수가 있으면 꼭 코멘트 부탁드립니다.

    소스 코드



    sample.py
    # coding=utf-8
    from flask import Flask, render_template, request
    
    # Flaskアプリ準備
    app = Flask("sample")
    
    # this is a part of celery property to use in Flask
    from celery import Celery
    def make_celery(app):
        celery = Celery(
            app.import_name,
            backend=app.config['CELERY_RESULT_BACKEND'],
            broker=app.config['CELERY_BROKER_URL']
        )
        celery.conf.update(app.config)
    
        class ContextTask(celery.Task):
            def __call__(self, *args, **kwargs):
                with app.app_context():
                    return self.run(*args, **kwargs)
    
        celery.Task = ContextTask
        return celery
    
    # update flask config to use celery
    app.config.update(
        CELERY_BROKER_URL='redis://localhost:6379',
        CELERY_RESULT_BACKEND='redis://localhost:6379'
    )
    celery = make_celery(app)
    
    @celery.task()
    def add(a, b):
        print(a + b)
        return a + b
    
    @app.route('/', methods=["GET", "POST"])
    def sample():
    
        # POST時の処理
        if request.method == 'POST':
            return render_template(
                'main.html',  # 表示するHTMLファイル
                )
    
        # GET時の処理
        else:
            return render_template(
                'main.html',  # 表示するHTMLファイル
                )
    
    @app.route('/celery', methods=["POST"])
    def celery_test():
    
        if request.method == 'POST':
            a = int(request.form["num_one"])
            b = int(request.form["num_two"])
            result = add.delay(a,b)
            return render_template(
                    'main.html',  # 表示するHTMLファイル           
                    )
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0', port=9000)
    

    main.html
    <!DOCTYPE html>
    <html lang="ja">
      <head>
        <meta charset="utf-8"/>
        <title>Sample</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
      </head>
    
      <body>      
        <div class="container">
          <div class="jumbotron">
            <h1>
              <p align="center">
                <font size="10">Flask 非同期処理</font>
              </p>
            </h1>
          </div>
    
          <form class="" method="post" action="/celery" enctype="multipart/form-data">
            <div class="container" style="text-align: center;">
              <input type="number" name="num_one">  +  
              <input type="number" name="num_two">
            </div>
    
            <div class="button_wrapper" style="text-align: center;">
              <button type="submit" class="btn btn-lg btn-success" style="margin-top: 50px; ">計算実行</button>
            </div>
    
          </form>
        </div> 
    
      </body>
    </html>
    
    

    참고문헌



    Windows용 Redis를 설치하고 만져보세요
    ㅡtp://카케우라. 하테나아 ry. jp
    Flask 공식
    htps // f sk. 파트 tsp 로지 cts. 코 m/엔/1.0. x / 파테 rs s / 세이 ry /
    python – Celery Worker를 시작할 수 없음
    htps // 코데다 y. Me / jp / Ku / 20190525 / 900758. HTML
    celery AttributeError: 'str' object has no attribute 'items' django Day14
    h tp // w w. p로g 라메 r 그래 ght. 코 m/아리치 cぇ/8120463251/

    좋은 웹페이지 즐겨찾기