python学习笔记-tip55(ThreadLocal)

引言

上一章,我们已经用到了多线程了,而且还用到了「全局变量」 :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解决了在一个线程中多个函数之间相互传递的问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容