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对象在每层的函数的传递问题 缺点是代码不够友好 '''