#python #windows #subprocess #fastapi #uvicorn
Вопрос:
Я запускаю несколько экземпляров FastAPI с помощью uvicorn с подпроцессом python.Попен. У меня есть небольшой графический интерфейс, созданный с помощью PySimpleGUI, с помощью которого я хочу иметь возможность закрывать серверы и перезапускать их по желанию.
Первая проблема, с которой я столкнулся, заключается в том, что, по крайней мере в Windows, запуск сервера uvicorn, по-видимому, создает не один, а два новых процесса, а вызов Popen.terminate()
закрывает только один из этих процессов, что не освобождает порт, связанный с сервером. Я исправил эту проблему с помощью пакета psutil, чтобы проверить, какие новые процессы были созданы после создания экземпляра объекта Popen, а также отслеживать и завершать второй процесс с помощью psutil.
Что все еще является серьезной проблемой, так это то, что вызов psutil.terminate()
процесса не вызывает функцию FastAPI в разделе @app.on_event("shutdown")
. В прошлом мы запускали все наши серверы в отдельных окнах терминалов и обнаружили, что ctrl-c в этих окнах терминалов вызовет событие завершения работы, но я не нашел другого способа сделать это. ctrl-c в моем интерфейсе, очевидно, отключит интерфейс и все серверы и несколько ненадежен в достижении событий завершения работы для всех серверов. Моей другой идеей было использовать psutil.send_signal(signal.CTRL_C_EVENT)
, но это имеет тот же эффект, что и вызов ctrl-c в терминале.
Так что я в растерянности. Я видел множество постов, в которых говорилось, что это общий недостаток uvicorn, но не видел ничего, что бы напрямую подтверждало мой собственный опыт или предлагало решение. Я также знаю, что события «завершение работы» и «запуск» в FastAPI переносятся из Starlette и не очень хорошо документированы ни в одном из пакетов. Я видел предложения по использованию guvicorn, но мой краткий обзор подтвердил, что он несовместим с Windows. Есть какие-нибудь предложения?