例如来自bash:
kill -9 -PID
os.kill(pid, signal.SIGKILL) 只杀死父进程.
我有一个用Uvicorn + FastAPI编写的 REST-API 应用程序
我想使用 PyTest 进行测试。
我想在开始测试时在夹具中启动服务器,因此当测试完成时,夹具将终止应用程序。
FastAPI 测试展示了如何测试 API 应用程序,
from fastapi import FastAPI
from starlette.testclient import TestClient
app = FastAPI()
@app.get("/")
async def read_main():
return {"msg": "Hello World"}
client = TestClient(app)
def test_read_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"msg": "Hello World"}
Run Code Online (Sandbox Code Playgroud)
这不会以通常的方式使服务器联机。似乎由 client.get 命令触发的特定功能是唯一运行的东西。
我找到了这些额外的资源,但我无法让它们为我工作:
https://medium.com/@hmajid2301/pytest-with-background-thread-fixtures-f0dc34ee3c46
您将如何从 PyTest 运行 Uvicorn+FastAPI 应用程序,以便它随着测试而上升和下降?
我正在寻找将 uvicorn.run() 与 FastAPI 应用程序一起使用但没有 uvicorn.run() 阻塞线程的可能性。我已经尝试使用进程、子进程和线程,但没有任何效果。我的问题是我想从另一个进程启动服务器,该进程在启动服务器后应该继续执行其他任务。另外,我在从另一个进程关闭服务器时遇到了问题。
有没有人知道如何使用 uvicorn.run() 非阻塞以及如何从另一个进程中阻止它?
问候 LeukoClassic
我正在使用 uvicorn 和 python 的 subprocess.Popen 运行多个 FastAPI 实例。我有一个用 PySimpleGUI 制作的小型 GUI,我希望能够随意关闭服务器并重新启动它们。
我遇到的第一个问题是,至少在 Windows 中,启动 uvicorn 服务器似乎创建的不是一个,而是两个新进程,并且调用Popen.terminate()仅关闭其中一个进程,这不会释放与服务器关联的端口。我使用 psutil 包修复了此问题,以检查实例化 Popen 对象后创建了哪些新进程,并使用 psutil 跟踪和终止第二个进程。
还有一个主要问题是,调用psutil.terminate()进程并没有调用.net下的FastAPI函数@app.on_event("shutdown")。过去,我们在单独的终端窗口中运行所有服务器,并发现这些终端窗口上的 ctrl-c 将调用关闭事件,但我没有找到其他方法来执行此操作。我界面上的 ctrl-c 显然会关闭界面和所有服务器,并且在命中所有服务器的关闭事件方面有些不可靠。我的另一个想法是 use psutil.send_signal(signal.CTRL_C_EVENT),但这与在终端中调用 ctrl-c 具有相同的效果。
所以我很茫然。我看到很多帖子说这是 uvicorn 的普遍缺点,但没有看到任何直接证实我自己的经验或提供解决方案的内容。我还知道 FastAPI 中的“关闭”和“启动”事件是从 Starlette 移植的,并且在这两个包中都没有很好的记录。我看到过使用 guvicorn 的建议,但我的简短调查证实它与 Windows 不兼容。有什么建议么?