摘至本人有道云笔记《Python--ThreadLocal》
1.ThreadLocal
在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。
但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦。
local = threading.local()
此时这个local就变成了一个全局变量,但这个全局变量只在该线程中为全局变量,对于其他线程来说是局部变量,别的线程不可更改。全局变量local就是一个ThreadLocal对象。
全局变量local就是一个ThreadLocal对象,每个线程对它都可以读写a属性,但互不影响。可以把local看成全局变量,但每个属性如local.a都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理。
可以理解为全局变量local是一个dict字典,还可以绑定其他变量,如local.b等等。
ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。
用ThreadLocal解决(Python线程)笔记中数据错乱的问题
每个线程内共享local.num,但是线程与线程之间不会互相影响