Django中如何获取类变量的最新更新值
问题根因
你的问题本质是两点:
- 类变量是进程隔离的:Django/DRF 部署时默认启动多 worker 进程处理请求,
p_request运行的进程和处理post请求的进程是独立的,两个进程内的ConnectTestAPI.result、ConnectTestAPI.orderNo是完全独立的副本,你在post里修改的是另一个进程的变量值,当前运行p_request的进程根本感知不到。 - 无限循环无休眠:你写的
while True没有任何等待逻辑,会占满当前CPU核心,就算是同进程内的多线程场景,也会因为CPU被循环占满,导致处理post请求的线程拿不到调度资源,永远无法执行更新逻辑。
解决方案
你已经引入了Redis,直接用Redis存储需要跨进程共享的result和orderNo即可,同时给循环加休眠和超时机制避免卡死:
import json import time from django.http import HttpResponse from rest_framework.views import APIView import redis # 建议把Redis连接抽成公共配置,避免重复初始化 outside_server = {"ip": "你的Redis地址", "port": "你的Redis端口"} redis_conn = redis.StrictRedis(outside_server['ip'], outside_server['port'], decode_responses=True) class ConnectTestAPI(APIView): def post(self, request): data = request.data # 把更新的值存入Redis,替代类变量 redis_conn.set("api_result", data['result']) redis_conn.set("api_orderNo", data['orderNo']) print(redis_conn.get("api_result")) print(redis_conn.get("api_orderNo")) return HttpResponse("ok") # 加静态方法装饰器,否则调用会报参数缺失错误 @staticmethod def p_request(timeout=30): # 加超时时间,单位秒,避免无限等待 data = { "a" : 1234, "b" : 5678 } data = json.dumps(data, ensure_ascii=False).encode('utf-8') redis_conn.set("data_dict", data) # 先清空之前残留的旧值 redis_conn.delete("api_result", "api_orderNo") start_time = time.time() while True: # 超时判断 if time.time() - start_time > timeout: raise TimeoutError("等待接口回调超时") # 从Redis取共享值 result = redis_conn.get("api_result") orderNo = redis_conn.get("api_orderNo") if result and orderNo and int(orderNo) != 0: # 取完把临时值清掉,避免影响下次请求 redis_conn.delete("api_result", "api_orderNo") return result, int(orderNo) # 每次循环休眠100ms,降低CPU占用 time.sleep(0.1)
额外说明
如果你的业务场景存在高并发请求,还可以给Redis的key加唯一请求标识,避免不同请求的结果互相覆盖。
内容的提问来源于stack exchange,提问作者Jo Jay
相关产品推荐
相关产品推荐

