在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。
但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦, 每个函数一层一层调用都这么传参数那还得了?用全局变量?也不行,因为每个线程处理不同的Student对象,不能共享。
如果用一个全局dict存放所有的Student对象,然后以thread自身作为key获得线程对应的Student对象如何?
这种方式理论上是可行的,它最大的优点是消除了std对象在每层函数中的传递问题,但是,每个函数获取std的代码有点low。
有没有更简单的方式?
ThreadLocal应运而生,不用查找dict,ThreadLocal帮你自动做这件事:
import threading
#定义一个全局的threadLocal
local_school = threading.local()
def process_student():
# 在这里取出threadLocal里面的参数
std = local_school.student
print("%s 是在 %s里的"%(std, threading.current_thread().name))
def process_thread(name):
# 在这里给threadLocal传递参数
local_school.student = name
#直接调用,无需传参
process_student()
#开启两个线程
t1 = threading.Thread(target = process_thread, args = ("chen ge",), name = "Thread-A")
t2 = threading.Thread(target = process_thread, args = ("小明",), name = "Thread-B")
t1.start()
t2.start()
t1.join()
t2.join()
执行结果:
chen ge 是在 Thread-A里的
小明 是在 Thread-B里的
一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题