裏でシェルのコマンドを発行するやつを作っていて、ハマったのでメモ
環境はWindows10、Python3.8.2、FastAPI 0.63.0、uvicorn 0.13.2
原因は使用するイベントループだった。Subprocessのドキュメントによると、WindowsではProactorEventLoopを使用している場合のみSubprocessを使う事ができるらしい(SeletcorEventLoopだとダメ)。
使っているイベントループを確認してみたら....
$ uvicorn fastapi_eventloop:app
<_WindowsSelectorEventLoop running=True .......>
oh.....
FastAPIのGitHubにて問題の解決に繋がりそうなissueが生えてた。このコメントによると以下のコードでイベントループをProactorEventLoopに変更できるらしい。
$ uvicorn hoge:fuga のような使い方はできなくなる。(普通に$ Python3 hoge.py と実行する)
Windows自体いい感じの環境ではないそうで、最高の状態で使いたい場合はLinuxを使ってね。とのこと(
https://github.com/tiangolo/fastapi/issues/1110#issuecomment-612966253)