zoukankan      html  css  js  c++  java
  • 18.全局字典解决全局变量不安全,局部变量传参复杂的问题,优缺点

    '''
    在多线程环境下,每个线程都有自己的数据,一个线程使用自己的局部变量比使用全局变量好,
    因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁(阻塞--效率低)
    
    但是在使用局部变量的时候,就在函数间调用的时候,传递起来很麻烦
    
    每个函数一层一层调用这个传递过来的参数,很麻烦,用全局变量,不安全,效率低
    每个线程处理不同的student对象,不能共享
    '''
    import threading
    class Student():
        def __init__(self,name):
            self.name = name
    
    global_dic = {}
    def process_student(name):
        std = Student(name)
        global global_dic
        global_dic[threading.current_thread()] = std
        print('process_student',std.name)
    
        #std是局部变量,但是每个函数都要用,因此必须将这个变量传递出去
        do_task_1()
        do_task_2()
    
    def do_task_1():
        std = global_dic[threading.current_thread()]
        print("do_task_1",std.name)
        do_subtask_1()
    
    def do_task_2():
        std = global_dic[threading.current_thread()]
        print("do_task_2", std.name)
        do_subtask_2()
    
    def do_subtask_1():
        std = global_dic[threading.current_thread()]
        print("do_task_1", std.name)
    
    def do_subtask_2():
        std = global_dic[threading.current_thread()]
        print("do_task_2", std.name)
    
    if __name__ == '__main__':
        t1 = threading.Thread(target=process_student,args=('小明',))
        t2 = threading.Thread(target=process_student,args=('铁蛋',))
        t1.start()
        t2.start()
        # print(global_dic)
    
    '''
    解决方案:
    使用全局字典的方法--用一个全局的dic存放所有的Student对象,然后以thread自身作为key获取std
    
    这个方案不足:
    有点事消除了std对象在每层的函数的传递问题
    缺点是代码不够友好
    '''
  • 相关阅读:
    【软件测试部署基础】maven的认识
    测试管理那些事[组建测试团队的思考]
    Django 框架基本操作(二)
    测试人员的工作开展方式
    产品管理基础知识
    项目经理与职能经理的区别
    python 面向对象(二)
    Python 常用方法和模块的使用(time & datetime & os &random &sys &shutil)-(六)
    python基本案例实现
    JAVA基础——集合浅析
  • 原文地址:https://www.cnblogs.com/zhangboblogs/p/8627619.html
Copyright © 2011-2022 走看看