引言
上一章,我们已经用到了多线程了,而且还用到了「全局变量」 :global 声明的变量,但是,其实在子线程中,使用子线程中的「局部变量」比使用「全局变量」要好一些,因为在使用「全局变量」的时候,会有多线程并发
的问题,这时候还需要引入「线程锁」来解决。
但是,使用「局部变量」也是有一些问题 ,比如在函数调用中,传递起来比较麻烦,比如 A 函数调用 B 函数,A 函数同时也调用 C 函数,而A 函数中的局部变量需要传递到 B 中去,同时也要传递到 C中去,这样书写的话,就过于繁琐。
python 是谁呀,肯定会为我们提供方便操作的东西呀,这个东西就是今天的课题啦
ThreadLocal
ThreadLocal
其实,ThreadLocal 充当的角色,就如上面我提到的那个「容器」,他一般定义成「全局变量」,然后在子线程中,可以通过使用 ThreadLocal 的「装载」功能,对各个子线程所需要的「局部变量」进行存储,当子线程外需要数据时,直接从ThreadLocal中获取即可。
恩 ,如果上面的解释大家没有看懂的话,那么还是跟我来看一下实际使用吧
先将 ThreadLocal 的创建和使用 贴出来吧,方便查看
好,下面来看一下使用场景
由此可见,虽然 ThreadLocal 是全局变量,但是 ThreadLocal.student 这个则是每个线程独有的局部变量,且这连个局部变量虽然引用是一样的,其实不是同一个东西。
可以把 ThreadLocal 认为是一个 dict ,key 是子线程本身,value 而是存储的对象,只有通过子线程自己才能拿到对应的对象。
扩展一下
ThreadLocal 最长用的地方有以下几个方面:
- 为每个子线程绑定一个数据库连接
- 为每个子线程绑定一个 Http请求
- 用户身份信息
这样,一个线程才会非常方便的访问到这些资源
总结
ThreadLocal 虽然是全局变量,但是每个线程都只能读写自己独立的版本。
ThreadLocal解决了在一个线程中
多个函数之间相互传递的问题
网友评论