【问题标题】:FastAPI and Python threadsFastAPI 和 Python 线程
【发布时间】:2020-10-06 08:04:34
【问题描述】:

我对 FastAPI 和其他线程产生了一点问题。假设我有一个服务于两个端点的应用程序。

  1. 其中一个/create_user 在某个数据库中创建用户
  2. 其他只是/ping。 Ping 只是因为我的应用在 Kubernetes 中运行,它通过发送 GET 请求并接收 response_code 200 不断检查我的应用是否处于活动状态。
  3. 此外,我还有一个使用threading.Thread 制作的单独进程,它从外部服务接收一些密钥。 Key 有 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 中的代码 sn-p

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

【问题讨论】:

    标签: python multithreading python-3.7 python-multithreading fastapi


    【解决方案1】:

    我认为主要问题是您可能没有使用异步兼容库来访问您的数据库。

    这就是您在应用程序等待数据库时看到所有其他端点被锁定的原因。

    这个问题有两种解决方案。

    您可以找到一个异步库来访问您的数据库。

    或者您可以使用def create_user() 代替async def create_user(),这样FastAPI 将在线程池中为您运行该函数。

    【讨论】:

    • 非常感谢!我忘记了在 ThreadPool 中使用普通 def 而不是 async def FastAPI 运行函数。搜索 async db lib 我认为是矫枉过正,因为服务将以不太大的负载运行
    • 我在为 ML 实现 API 时遇到了这个问题。无法使用异步方法在 CPU 上实现 PyTorch 推理。 python 中的大多数机器学习工具可能都不支持异步推理。总而言之,这不是 ML 的可行解决方案。
    猜你喜欢
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多