4

現在、外部サーバーからデータを取得し、結果をフロント エンドにプッシュする Flask アプリのルートがあります。外部サーバーの速度が遅くなったり、応答しなくなったりすることがあります。外部サーバーが遅れている場合にフロントエンドがハングしないように、ルート呼び出しにタイムアウトを設定する最良の方法は何ですか? または、Flask (Apache、nginx などではなく) でこの状況を処理するためのより適切な方法はありますか?

私の目標は、ルート呼び出しをタイムアウトすることであり、この SO question: Time out issues with chrome and flameのように任意の長いプロセスを存続させないことです。Websockets のようなオプションは、完了するまでバックグラウンド プロセス/スレッドを実行します。ただし、一定の時間が経過したら、遅いルート呼び出しを停止したいと考えています。関数呼び出しのタイムアウトやPython タイムアウトと同様ですが、Flask コンテキスト内です。Celery のタスク デコレータ ( Python、Flask、および Celery を使用した同時非同期プロセス) は優れたソリューションのように思えますが、その機能のごく一部を使用するために大きな依存関係を要求したくありません。

4

1 に答える 1

2

私がこれについてすべて正しいかどうかは完全にはわかりませんが、リクエストを処理するスレッド (またはグリーンスレッド) が独自の「フォアグラウンド」でネットワーク呼び出しを行い、その呼び出しがタイムアウトした場合、壊れたパイプはほとんど起ころうとしている。しかし、できることは、ネットワーク リクエストを実行する完全に別のスレッドをスピンオフし、リクエスト処理コードでタイムアウトを指定して Thread.join() を呼び出すことです。

http://docs.python.org/2/library/threading.html#threading.Thread.join

その時点で、Thread.isAlive() を呼び出します (まだ要求処理コード パスにあります)。True の場合、ネットワーク呼び出しは時間内に返されず、エラー状態が返されます。

False の場合 - 「ワーカー」スレッドに応答データで (スレッドセーフな) データ構造を更新させる必要があります - その応答データを取得して先に進みます。

于 2013-08-10T17:39:43.090 に答える