线程内的全局变量-ThreadLocal
对于每个线程获取变量值时, 只能使用函数进行传值,但对于多级函数,传参比较麻烦
ThreadLocal解决方案
import threading # 创建全局ThreadLocal变量 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=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请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源