前提・実現したいこと
高負荷に耐えられるAPIを作成したい
発生している問題・エラーメッセージ
Process SpawnProcess-1: Traceback (most recent call last): File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 315, in _bootstrap self.run() File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\subprocess.py", line 61, in subprocess_started target(sockets=sockets) File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\main.py", line 419, in run loop.run_until_complete(self.serve(sockets=sockets)) File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 629, in run_until_complete self.run_forever() File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 596, in run_forever self._run_once() File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 1854, in _run_once event_list = self._selector.select(timeout) File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\selectors.py", line 324, in select r, w, _ = self._select(self._readers, self._writers, [], timeout) File "C:\Users\ikki1\AppData\Local\Programs\Python\Python39\lib\selectors.py", line 315, in _select r, w, x = select.select(r, w, w, timeout) ValueError: too many file descriptors in select()
該当のソースコード
Python3
1from fastapi import FastAPI, Depends 2import uvicorn 3 4app = FastAPI() 5 6@app.get("/user/{user_id}") 7def hello(user_id): 8 9 return r 10 11if __name__ == "__main__": 12 uvicorn.run("api:app", host="0.0.0.0", reload=True, port=80)
試したこと
reloadを消してみたりしましたがFastAPIなどでは正直耐えられない負荷は耐えられないというふうな結論が出そうだったのでどうにか高負荷に耐える方法があるかを教えてほしいです。
関数の処理内は消しています。ただ単純にthreading+requestsでストレステストを行ったら落ちてしまうため知ってる方が居たら助けていただけると助かります。
確認ですが`async def`を使えない理由があるのですか?
https://fastapi.tiangolo.com/async/#in-a-hurry
あともしかしてOSはWindowsでしょうか?
Windowsの場合uvicornはパフォーマンスが出せないとどこかで見た気がします。
エラーログからwindowsで select を使ってるようなので、
IOCP を使ったイベントループにすることで改善の余地はありそうですが、
uvicorn の IOCP はサポート外れてるみたいですね。
ありがとうございます!
async defを使っていなかったのは単純に私の参考にしていた記事が使用しておらず付け足し忘れていました...
OSはWindowsです!
async defに変更したところエラーは出なくなりましたがやはりリクエストが順番に処理されてしまい大量のリクエストを捌くことができません...(エラーは出ませんが数リクエストで最新のリクエストが応答待ちになる)
async defに変更するうえでその関数の中身はおそらく非同期に対応させなきゃいけないのでtime.sleepなどの処理を非同期のものに変更したのですがそうすると質問最初のエラーが出てしまいます。