Согласно документации Uvicorn , программно не существует способа остановить сервер. вместо этого вы можете остановить сервер только нажав ctrl + c (официально).
Но у меня есть хитрость, чтобы решить эту проблему программно, используя многопроцессорная стандартная библиотека с тремя простыми функциями:
- Функция запуска для запуска сервера.
- Функция запуска для запуска нового процесса (запуска сервера).
- Функция остановки для присоединения к процессу (остановки сервера).
from multiprocessing import Process
import uvicorn
# global process variable
proc = None
def run():
"""
This function to run configured uvicorn server.
"""
uvicorn.run(app=app, host=host, port=port)
def start():
"""
This function to start a new process (start the server).
"""
global proc
# create process instance and set the target to run function.
# use daemon mode to stop the process whenever the program stopped.
proc = Process(target=run, args=(), daemon=True)
proc.start()
def stop():
"""
This function to join (stop) the process (stop the server).
"""
global proc
# check if the process is not None
if proc:
# join (stop) the process with a timeout setten to 0.25 seconds.
# using timeout (the optional arg) is too important in order to
# enforce the server to stop.
proc.join(0.25)
С той же идеей вы можете :
Пример использования:
from time import sleep
if __name__ == "__main__":
# to start the server call start function.
start()
# run some codes ....
# to stop the server call stop function.
stop()
Подробнее о: