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对象在每层的函数的传递问题
缺点是代码不够友好
'''
原文地址:https://www.cnblogs.com/zhangboblogs/p/8627619.html