我有一个简单的 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 https://github.com/tiangolo/uvicorn-gunicorn-docker图像,默认情况下会创建多个工作人员。摘自Gunicorn_conf.py https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/master/docker-images/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 https://github.com/tiangolo/uvicorn-gunicorn-docker#workers_per_core
如果你想在worker之间共享数据,请注意这一点topic https://stackoverflow.com/q/65686318/13782669.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)