gpt4 book ai didi

Python - 如何在不阻塞线程的情况下使用 FastAPI 和 uvicorn.run?

转载 作者:行者123 更新时间:2023-12-03 16:11:19 26 4
gpt4 key购买 nike

我正在寻找将 uvicorn.run() 与 FastAPI 应用程序一起使用但没有 uvicorn.run() 阻塞线程的可能性。我已经尝试使用进程、子进程和线程,但没有任何效果。
我的问题是我想从另一个进程启动服务器,该进程在启动服务器后应该继续执行其他任务。另外,我在从另一个进程关闭服务器时遇到了问题。
有谁知道如何使用 uvicorn.run() 非阻塞以及如何从另一个进程中阻止它?
你好
白细胞经典

最佳答案

@HadiAlqa​​ttan 给出的方法将不起作用,因为 uvicorn.run期望在主线程中运行。 signal only works in main thread等错误将被提升。
正确的做法是:

import contextlib
import time
import threading
import uvicorn

class Server(uvicorn.Server):
def install_signal_handlers(self):
pass

@contextlib.contextmanager
def run_in_thread(self):
thread = threading.Thread(target=self.run)
thread.start()
try:
while not self.started:
time.sleep(1e-3)
yield
finally:
self.should_exit = True
thread.join()

config = Config("example:app", host="127.0.0.1", port=5000, log_level="info")
server = Server(config=config)

with server.run_in_thread():
# Server is started.
...
# Server will be stopped once code put here is completed
...

# Server stopped.
使用 pytest 夹具在本地运行实时测试服务器非常方便:
# conftest.py
import pytest

@pytest.fixture(scope="session")
def server():
server = ...
with server.run_in_thread():
yield
积分: uvicorn#742来自 florimondmanca

关于Python - 如何在不阻塞线程的情况下使用 FastAPI 和 uvicorn.run?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61577643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com