サーバーのタイムアウトやその他のトリックを変更してページを「有効」に保つことができますが、制御できない接続の他の部分があり、リクエストがタイムアウトになる可能性があることに注意してください (タイムアウトなど)。ブラウザの値、またはブラウザとサーバー間のプロキシなど)。また、タスクの完了に時間がかかる場合 (より高度になったり、より多くの人がタスクを使用するために遅くなったりする場合) は、タイムアウト値を常に上げておく必要があるかもしれません。
最終的に、この種の問題は通常、アーキテクチャを変更することで解決されます。
長時間実行されるタスクには別のプロセスを使用する
リクエストを送信して処理ビューでタスクを実行するのではなく、ビューは別のプロセスでタスクの実行を開始し、すぐに応答を返します。この応答により、ユーザーは「お待ちください。処理中です」というページに移動できます。そのページでは、多くのプッシュ テクノロジの 1 つを使用して、タスクがいつ完了したかを判断できます (ロング ポーリング、Web ソケット、サーバー送信イベント、N 秒ごとの AJAX 要求、または非常に単純な方法: ページをリロードする)。 5秒ごと)。
Web リクエストに別のプロセスを「開始」させる
とにかく、先ほど言ったように、リクエストを処理するビューは長いアクションを実行しません。バックグラウンド プロセスを開始してタスクを実行するだけです。このバックグラウンド プロセス ディスパッチを自分で作成するか (考えられるアイデアについては、この Flask スニペットを参照してください)、 Celeryや ( RQ ) などのライブラリを使用できます。
タスクが完了したら、何らかの方法でユーザーに通知する必要があります。これは、上で選択した通知方法の種類によって異なります。単純な「N 秒ごとの ajax リクエスト」の場合、タスクが完了したかどうかを確認する AJAX リクエストを処理するビューを作成する必要があります。これを行う一般的な方法は、長時間実行されるタスクで、最後のステップとしてデータベースを更新することです。ステータスを確認するためのリクエストは、データベースのこの部分の更新を確認できます。
長所と短所
この方法を使用すると (長時間実行されるタスクを要求に合わせようとするのではなく)、いくつかの利点があります。
1.) 時間のかかる Web リクエストの処理は、(ブラウザーとサーバー以外に) タイムアウトになる可能性のあるポイントが複数あるため、注意が必要です。この方法を使用すると、すべての Web リクエストが非常に短くなり、タイムアウトする可能性が大幅に低くなります。
2.) Flask (およびそれに似た他のフレームワーク) は、Web クエリに応答できる特定の数のスレッドのみをサポートするように設計されています。8 つのスレッドがあると仮定します。そのうちの 4 つが長いリクエストを処理している場合、残りの 4 つのリクエストだけが、より一般的なリクエスト (ユーザーがプロファイル ページを取得するなど) を実際に処理します。Web サーバーの半分が、Web コンテンツを提供していない何かを実行している可能性があります。さらに悪いことに、8 つのスレッドすべてが長いプロセスを実行している可能性があります。つまり、いずれかのスレッドが終了するまで、サイトは Web リクエストに完全に応答できなくなります。
主な欠点: タスク キューを起動して実行するための設定作業が少し多くなり、システム全体が少し複雑になります。ただし、Web 上で長時間実行されるタスクには、この戦略を強くお勧めします。