如何解决FastAPI和Python线程
我对FastAPI和其他线程产生有一点问题。假设我有一个服务于两个端点的应用程序。
- 其中一个用户
/create_user
在某个数据库中创建用户 - 其他仅仅是
/ping
。进行Ping仅仅是因为我的应用程序正在Kubernetes中运行,并且它通过发送GET请求并接收response_code 200来不断检查我的应用程序是否还存在。 - 此外,我有一个由
threading.Thread
进行的单独处理,该处理从外部服务接收一些密钥。密钥具有TTL,因此需要不定期更新。
问题是当我通过第一个端点加载数据时,我正在加载的数据库非常慢,最多可以回答10秒。在那一刻,所有其他端点(包括/ping
)都被锁定。因此,k8s认为我的应用已死,并尝试回滚它。
我可以简单地尝试增加使用命令uvicorn main:app --workers 4
为应用程序提供服务的工作者数量
但是每个工作人员也会产生额外的线程,并且日志中的输出看起来像这样
INFO: Application startup complete.
Hello from additional thread
INFO: Started server process [88030]
Hello from additional thread
INFO: Waiting for application startup
Hello from additional thread Hello from additional thread
INFO: Application startup complete. Hello from additional thread
我的问题是否可以仅使用多个gunicorn工人产生一个额外的线程?
这是我main.py中的代码段
@app.post("/api/v1/create_user")
async def create_user() -> JSONResponse:
"""Some creation magic here"""
return JSONResponse(status_code=status.HTTP_201_CREATED,content={"Success": True,"Username":raw_credentials["user"]})
@app.get("/ping",status_code=status.HTTP_200_OK)
async def dummy_response():
return
# Special treads lunching for some jobs that need to be repeated during app lifecycle.
t1 = Thread(target=renew_api_token)
t1.start()
解决方法
我相信主要的问题是您可能没有使用异步兼容的lib访问数据库。
这就是在应用程序等待数据库时看到所有其他端点都被锁定的原因。
有两个解决方案。
您可以找到一个异步库来访问您的数据库。
或者您可以使用def create_user()
而不是async def create_user()
,这样FastAPI将为您在ThreadPool中运行该函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。