python - 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, 无法预测
解决方案
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之间共享数据,请关注这个话题。
推荐阅读
- python - Pandas Python中的多柱形图
- r - 融化后ggplot2中关系方向性的变化
- python - 在 django.shortcuts.render 和 django.views.generic.TemplateView 之间进行选择
- java - 应用程序在果冻豆上崩溃
- xaml - Xamarin 在自定义渲染器中获取本机控件
- hbase - 无法在 Phoenix HDP2.6 中获取副本 0 的位置
- java - 理解 Java 中的数学:使用 Java 的 Math 类返回传递的整数的 2 的幂的方法
- android - 无法使用 android studio 连接到“xampp server localhost”
- javascript - Reactjs 点击移动到数组中的下一项
- java - i--中的死代码警告