[解決済み] fastapiの非同期バックグラウンドタスクは、他のリクエストをブロックしますか?
2022-02-28 10:16:36
質問
fastapiで簡単なバックグラウンドタスクを実行したいのですが、データベースにダンプする前に何らかの計算を伴います。しかし、その計算は、それ以上のリクエストを受け取ることをブロックするでしょう。
from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
db = Database()
async def task(data):
otherdata = await db.fetch("some sql")
newdata = somelongcomputation(data,otherdata) # this blocks other requests
await db.execute("some sql",newdata)
@app.post("/profile")
async def profile(data: Data, background_tasks: BackgroundTasks):
background_tasks.add_task(task, data)
return {}
この問題を解決する最善の方法は何でしょうか?
解決方法は?
あなたの
task
は次のように定義されています。
async
ということは、fastapi(というかstarlette)はasyncioのイベントループの中で実行されることになります。
そして
somelongcomputation
は同期(つまり IO を待たずに計算を行う)なので、イベントループが実行されている間はブロックされます。
これを解決する方法はいくつかありますね。
-
より多くのワーカーを使用する(例
uvicorn main:app --workers 4
). これにより、最大で4つのsomelongcomputation
を並列に表示します。 -
にならないようにタスクを書き換えてください。
async
(として定義します。def task(data): ...
など)。そうすると、starletteは別スレッドで実行します。 -
使用方法
fastapi.concurrency.run_in_threadpool
も別スレッドで実行されます。このようにfrom fastapi.concurrency import run_in_threadpool async def task(data): otherdata = await db.fetch("some sql") newdata = await run_in_threadpool(lambda: somelongcomputation(data, otherdata)) await db.execute("some sql", newdata)
-
別のスレッド/プロセスを自分で起動する。例えば
concurrent.futures
. -
celeryのようなもっと強引なものを使ってください。(fastapiのドキュメントにも記載されています。 ここで ).
関連
-
Pythonの非常に便利な2つのデコレーターを解説
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Python Decorator 練習問題
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] Pythonリクエストによる非同期リクエスト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python関数の高度な応用を解説
-
python string splicing.join()とsplitting.split()の説明
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
Pythonショートビデオクローラーチュートリアル
-
Python 入出力と高次代入の基礎知識
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Python: OverflowError: 数学の範囲エラー