Как использовать FastAPI и uvicorn.run без блокировки потока? - PullRequest
0 голосов
/ 03 мая 2020

Я ищу возможность использовать uvicorn.run () с приложением FstAPI, но без uvicorn.run () блокирует поток. Я уже пытался использовать процессы, подпроцессы и потоки, но ничего не получалось. Моя проблема в том, что я хочу запустить Сервер из другого процесса, который должен go работать с другими задачами после запуска сервера. Кроме того, у меня есть проблемы при закрытии сервера, как это из другого процесса.

Кто-нибудь знает, как использовать неблокирующий uvicorn.run () и как остановить его из другого процесса?

Привет LeukoClassi c

1 Ответ

0 голосов
/ 06 мая 2020

Согласно документации 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)


С той же идеей вы можете :

  • использовать threading стандартный lib вместо использования multiprocessing standard lib.

  • преобразовать эти функции в класс.


Пример использования:

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()



Подробнее о:

...