fastApi 中的 python 全局变量无法正常工作

新手上路,请多包涵

我有一个简单的 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。我得到的:调用 changeResponse 参数为 7,获得响应 7,调用 changeReponse 8,有时响应为 7 , 有时是 8, 无法预测

原文由 rookie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

tiangolo/uvicorn-gunicorn-fastapi 基于 uvicorn-gunicorn-docker 镜像,默认创建多个 worker。摘自 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

此处 对这些变量和示例进行了更详细的描述


如果你想在 Worker 之间共享数据,请关注这个 话题

原文由 alex_noname 发布,翻译遵循 CC BY-SA 4.0 许可协议

有同样的问题并且在不改变工人的情况下得到解决。

 app = FastAPI()

app.type = "00"

我认为这是最好的选择。

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

原文由 NIK 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏