在多线程的环境下,某些特定场景,多线程使用自己的局部变量比使用全局变量要好,不会影响其他线程因此不用加锁
但是线程在使用局部变量的时候也有缺点,就是当多层函数调用的时候,参数传起来不是很方便,如:
这样传参,如果调用的函数较多较频繁,则很麻烦
再如,我们可以使用全局字典的方式进行提取每个线程自己对应的值,取消传参的操作,如:
将线程的名字作为键,变量直接传入字典中作为对应线程键的值
这样也可以达到传参的效果
但是这样写会有些小小的lower,体现不出来高大上的代码风格,于是我们使用threadlocal对象
import threading
local = threading.local() #生成一个threadlocal对象
list1 = [] #建一个全局容器
def t_name(name):
local.name = name #获取传入的参数,赋值给local对象
t_thread() #调用下层函数
def t_thread():
list1.append(local.name) #获取name添加到列表中
print(list1,threading.current_thread().name)
t1 = threading.Thread(target=t_name,args=('haha',),name='A')
t2 = threading.Thread(target=t_name,args=('xixi',),name='B')
t1.start() #开启
t2.start()
t1.join() #阻塞
t2.join()
结果
['haha'] A
['haha', 'xixi'] B
ok,完成
ThreadLocal 最常用的地方就是为每个线程绑定一个数据库连接,HTTP 请求, 用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问 这些资源。
一个 threadLocal 变量虽然是全局变量,但每个线程都只能读写自己线程的独立 副本,互不干扰。threadLocal 解决了参数在一个线程中各个函数之间互相传递 的问题。