【问题标题】:python global variable in fastApi not working as normalfastApi中的python全局变量无法正常工作
【发布时间】:2020-09-18 04:14:58
【问题描述】:

我有一个简单的 fastApi 演示应用程序,它实现了一个功能: 通过调用名为 changeResponse 的 post api 获取不同的响应 json。 changeResponse api 只是更改了一个全局变量,另一个 api 通过同一个全局变量返回不同的响应。在本地环境中,它可以正常工作,但是当我在 docker 上构建它时,我只调用一次 changeResponse 后响应总是改变。代码如下如下:

from typing import Optional
from fastapi import FastAPI
from util import read_json
import enum

app = FastAPI()

type = "00"
    
@app.post("/changeResponse")
async def handle_change_download_response(param:Optional[str]):
        global type
        type = param
        print("type is "+type)
        return {"success":"true"}

@app.post("/download")
async def handle_download(param:Optional[str]):
    print("get download param: "+param)
    if legalDownload(param):
        print("type is "+type)
        return read_json.readDownloadSuccessRes(type)
    else:
        return read_json.readDownloadFailRes()

def legalDownload(data:str)->bool:
    return True

dockerfile如下:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app

我除了: 调用 changeResponse 参数为 7,获取 7 的响应, 调用 changeResponse 参数为 8,获取 8 的响应。 我得到了什么: call changeResponse param is 7, get response for 7, call changeReponse 8, some time response is 7, sometime is 8, 无法预测

【问题讨论】:

  • 您是如何将数据发送到 URL 的?我是说参数?
  • http://*.*.*.*/changeResponse?param=00 并使用 post 方法
  • 我想知道它是怎么发生的?

标签: python python-3.x docker fastapi uvicorn


【解决方案1】:

tiangolo/uvicorn-gunicorn-fastapi 基于uvicorn-gunicorn-docker 图像,默认情况下会创建多个工作人员。摘自gunicorn_conf.py

default_web_concurrency = workers_per_core * cores

因此,出现上述情况是因为请求由不同的工作人员(进程)处理。每个都有自己的全局变量副本

更新:如果要更改工作人员的数量,请使用以下环境变量:

  • WORKERS_PER_CORE:它将工作人员的数量设置为 CPU 核心数乘以该值。
  • MAX_WORKERS:您可以使用它让图像自动计算工作人员的数量,但要确保将其限制为最大值。
  • WEB_CONCURRENCY 覆盖工人数量的自动定义。

你可以这样设置:

docker run -d -p 80:80 -e WEB_CONCURRENCY="2" myimage

这些变量的更详细的描述和例子here


如果你想在worker之间共享数据,关注这个topic

【讨论】:

  • 谢谢,你是对的,我通过在运行 docker 镜像时设置 max_workers=1 解决了这个问题。
【解决方案2】:

遇到了同样的问题,得到了解决,无需更换工人。

app = FastAPI()

app.type = "00"

我认为这是最好的选择。

非常感谢参考:fastapi/issues/592

【讨论】:

    【解决方案3】:

    我已经知道原因了:

    fastapi 使用 uvicorn 运行应用,并使用 gunicorn 管理这些 uvicorn docker 容器中的 gunicorn 默认启动 2*num_of_core + 1 个工作人员来运行这些 uvicorn,所以我假设服务器中有三个应用程序,并且请求被发送给随机工作人员处理。这就是为什么响应是随机的 参考:https://docs.gunicorn.org/en/stable/design.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2022-01-15
      相关资源
      最近更新 更多