美文网首页
python学习笔记-tip55(ThreadLocal)

python学习笔记-tip55(ThreadLocal)

作者: 黑键手记 | 来源:发表于2018-12-01 00:39 被阅读6次

    引言

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

    相关文章

      网友评论

          本文标题:python学习笔记-tip55(ThreadLocal)

          本文链接:https://www.haomeiwen.com/subject/cjohcqtx.html