python:利用global 来实现跨文件 全局变量

注意: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了一个全局变量的副本到子进程, 父子进程信息不互通.  个人理解, 有大神解释,请指正

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值