线程全局变量ThreadLocal

线程内的全局变量-ThreadLocal

  • 对于每个线程获取变量值时, 只能使用函数进行传值,但对于多级函数,传参比较麻烦

  • ThreadLocal解决方案

      import threading  
    
      
      local_school = threading.local()  
    
      def process_student():  
          # 获取当前线程关联的studnet  
          std = local_school.student  
          # 对当前线程的全局变量拥有修改权  
          local_school.student = 'my'+local_school.student  
          print("hello, %s (in %s)" % (std, threading.current_thread().name))  
    
      def process_stu():  
          # 对当前线程的全局变量拥有修改权  
          std = local_school.student  
          print("hello, %s (in %s)" % (std, threading.current_thread().name))  
    
      def process_thread(name):  
          # 绑定ThreadLocal的studnet  
          local_school.student = name  
          process_student()  
          process_stu()  
          print(local_school.student)  
    
      t1 = threading.Thread(target大专栏  线程全局变量ThreadLocaltor">=process_thread, args=('Alce',), name="Thread-A")  
      t2 = threading.Thread(target=process_thread, args=('Bob',), name="Thread-B")  
      t1.start()  
      t2.start()  
      t1.join()  
      t2.join()  

    输出

      hello, Alce (in Thread-A)  
      hello, myAlce (in Thread-A)  
      myAlce  
      hello, Bob (in Thread-B)  
      hello, myBob (in Thread-B)  
      myBob  
  • 解析
    全局变量local_school就是一个ThreadLocal对象,每个Thread对它都可以读写student属性,但互不影响。你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理。

    可以理解为全局变量local_school是一个dict,不但可以用local_school.student,还可以绑定其他变量,如local_school.teacher等等。

    ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源

猜你喜欢

转载自www.cnblogs.com/wangziqiang123/p/11710799.html