7

Flask アプリケーションを使用して大きな PDF を生成しようとしています。pdf の生成では、10 個の長い pdf を生成し、それらをマージします。アプリケーションは、フラグ --worker-class gevent --workers 2 を指定して Gunicorn を使用して実行されます。

サーバー側のコードは次のようになります。

@app.route ('/pdf/create', methods=['POST', 'GET'])
def create_pdf():
    def generate():
        for section in pdfs:
            yield "data: Generating %s pdf\n\n" % section
            # Generate pdf with pisa (takes up to 2 minutes)

        yield "data:  Merging PDFs\n\n"
        # Merge pdfs (takes up to 2 minutes)
        yield "data: /user/pdf_filename.pdf\n\n"

    return Response(stream_with_context(generate()), mimetype='text/event-stream')

クライアント側のコードは次のようになります。

var source = new EventSource(create_pdf_url);
source.onopen = function (event) {
  console.log("Creating PDF")
}
source.onmessage = function (event) {
    console.log(event.data);
}
source.onerror = function (event) {
    console.log("ERROR");
}

GUnicornなしで実行すると、コンソール ログから安定したリアルタイムの更新が提供されます。それらは次のようになります。

Creating PDF
Generating section one
Generating section two
Generating section three
...
Generating section ten
Merging PDFS
/user/pdf_filename.pdf

このコードGunicorn で実行すると、定期的に更新されません。ワーカーは、Gunicorn のタイムアウトによって強制終了されるまで実行されます。その後、発生するはずだったすべてのメッセージのダンプが取得され、その後に最終エラーが発生します

Creating PDF
Generating section one
Generating section two
ERROR

Gunicorn のログは次のようになります。

[2015-03-19 21:57:27 +0000] [3163] [CRITICAL] WORKER TIMEOUT (pid:3174)

Gunicorn がプロセスを強制終了しないようにするにはどうすればよいですか? 非常に大きなタイムアウトを設定することは良い考えではないと思います。おそらく、gunicorn のワーカー クラスには、プロセスが正しく処理されていることを確認するために使用できるものがありますか?

4

1 に答える 1

1

Celeryを使用して問題を解決することになりました。

この例を使用して、Celery のセットアップをガイドしました。

次に、Grinberg の Celery チュートリアルを使用して、リアルタイムの更新をユーザーのブラウザーにストリーミングしました。

于 2015-03-30T15:29:26.853 に答える