roo*_*kie 6 python python-3.x docker fastapi uvicorn
我有一个简单的 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
Run Code Online (Sandbox Code Playgroud)
dockerfile 如下:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY ./app /app
Run Code Online (Sandbox Code Playgroud)
我除了:调用changeResponse 参数是7,得到7 的响应,调用changeResponse 参数是8,得到8 的响应。我得到的是:调用changeResponse 参数是7,得到7 的响应,调用changeReponse 8,有时响应是7 ,有时是 8,无法预测
ale*_*ame 10
tiangolo/uvicorn-gunicorn-fastapi基于uvicorn-gunicorn-docker镜像,默认情况下会创建多个工作进程。摘自gunicorn_conf.py:
default_web_concurrency = workers_per_core * cores
因此,出现所描述的情况是因为请求由不同的工作人员(进程)处理。每个都有自己的全局变量副本
更新:如果要更改工作人员数量,请使用以下环境变量:
你可以这样设置:
docker run -d -p 80:80 -e WEB_CONCURRENCY="2" myimage
Run Code Online (Sandbox Code Playgroud)
这些变量和示例的更详细描述请参见此处
如果你想在worker之间共享数据,请关注这个主题。
NIK*_*NIK 10
遇到了同样的问题,并在不更换工人的情况下得到了解决。
app = FastAPI()
app.type = "00"
Run Code Online (Sandbox Code Playgroud)
我认为这是最好的选择。
非常感谢参考:fastapi/issues/592
| 归档时间: |
|
| 查看次数: |
3818 次 |
| 最近记录: |