Python 多进程中 分享全局变量

在Python中,一种在多进程中,利用标签向进程分享全局变量,且开放Web接口的方法

import base64
import os
import time
import traceback

import cv2
from multiprocessing import Manager, Process
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
from fastapi import FastAPI, File, Form, UploadFile
import requests

model_config = {
    
    
    "process_N": 1,
    "port": 8099,
    "FastAPIWorks": 1  # must be number 1
}

app = FastAPI(
    title='FastAPI',
    description='FastAPI',
    version='1.0.0',
    docs_url='/docs',
    redoc_url='/redocs',
)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

updatelabel = 1
def get_db():
    global updatelabel
    updatelabel += 1
    table = "i am table" + str(updatelabel)
    return {
    
    "updatelabel": updatelabel, "table": table}
camera_info = Manager().list()
camera_info.append(get_db())

@app.get("/emq/")
def alg_analyse_bytes(a: int):
    if a == 1:
        camera_info[0] = get_db()
    return "ok"


@app.post("/init_process/")
def init_process(process_num: int = Form(...), passwd: str = Form(...)):
    if passwd == "woshimima":
        if process_num <= 8:
            for i in range(process_num):
                Process(target=deal_picture, args=(camera_info,)).start()
    return 1


def deal_picture(camera_info):
    camera_info_copy = dict(camera_info[0]).copy()
    while True:
        try:
            if camera_info_copy["updatelabel"] != camera_info[0]["updatelabel"]:
                camera_info_copy = dict(camera_info[0]).copy()
            # gogogo
            print(camera_info_copy)

        except:
            traceback.print_exc()


def cv2_to_base64(image):
    base64_str = cv2.imencode('.jpg', image)[1].tostring()
    base64_str = base64.b64encode(base64_str)
    return base64_str


def init_model():

    time.sleep(1)
    requests.post("http://0.0.0.0:" + str(model_config["port"]) + "/init_process",
                  data={
    
    "process_num": model_config["process_N"],
                        "passwd": "woshimima"})
    print(f"algorithm already start ")


if __name__ == '__main__':
    modulename = os.path.basename(os.path.abspath(__file__)).split(".")[0]
    Process(target=init_model).start()
    uvicorn.run(modulename + ':app',
                host='0.0.0.0',
                port=model_config["port"],
                reload=False,
                debug=False,
                workers=model_config["FastAPIWorks"])

Guess you like

Origin blog.csdn.net/x1131230123/article/details/121392489