注意:py文件的导包路径,根据自己的项目结构自己设置
上核心代码 global_params.py , 主要依赖global 关键字:
def _set(key, value):
""" 定义一个全局变量 """
judgeGlobalExist()
GLOBAL_PARAMS[key] = value
def _get(key, defValue=None):
""" 获得一个全局变量,不存在则返回默认值 """
judgeGlobalExist()
try:
return GLOBAL_PARAMS[key]
except KeyError:
return defValue
def _exisKey(key):
judgeGlobalExist()
return key in GLOBAL_PARAMS.keys()
def judgeGlobalExist():
if 'GLOBAL_PARAMS' not in globals().keys():
global GLOBAL_PARAMS
GLOBAL_PARAMS = {}
else:
pass
2. 测试类1 --> test_a.py ,设置跨文件全局变量 key-->test ,并在test_b.py的方法中拿到
from zc_utils.global_params import _set
from a_test.test_b import getDataFromGlobal
if __name__ == '__main__':
_set("test",11)
print(getDataFromGlobal())
测试类2 -->test_b.py
from zc_utils.global_params import _get
def getDataFromGlobal():
return _get("test")
结果如图:
进阶篇:
来了个这么个需求, 上头想要通过excel 来批量导入一批参数, 来测试模型的性能, 涉及多进程计算(一次参数取不同分位点的测试结果), 因此,想同样利用这样的全局变量来实现这个功能..
于是发现了个很好玩的现象..
核心:global_params.py 不变,修改测试文件 test_a.py
from concurrent import futures
from a_test.test_b import getDataFromGlobal
from zc_utils.global_params import _set
# 成功
# _set("test",11)
# 最宠定制方案
def finallyWays(data):
print(data)
_set("test", 11)
print(getDataFromGlobal())
def test(data):
print(data)
print(getDataFromGlobal())
if __name__ == '__main__':
# 失败
# _set("test", 11)
datas = [1, 2, 3]
with futures.ProcessPoolExecutor() as f:
# 测试
# f.map(test,datas)
# 最终方案
f.map(finallyWays, datas)
你会发现如果set放在main里 , 多进程 里面就取不到全局变量设置的值, 但是你放到main , 外面嘿嘿,居然能取到 , 但是 会有个问题, 在test_a 尝试更新, 新启的子进程里就读不到 修改后的值, 是不是很神奇, 这个有点像java 多线程 voliate 来实现内存可见 现象有点类似, 我的理解是, 有点像,copy了一个全局变量的副本到子进程, 父子进程信息不互通. 个人理解, 有大神解释,请指正