线程数据隔离(local概念)

一、local

在多个线程之间使用threading.local对象,可以实现多个线程之间的数据隔离

import time
import random
from threading import Thread,local

loc = local()

def func1():
    global loc
    print(loc.name,loc.age)

def func2(name,age):
    global loc
    loc.name = name
    loc.age = age
    time.sleep(random.uniform(0,2))
    func1()

Thread(target=func2,args=('明哥',19)).start()
Thread(target=func2,args=('小弟',17)).start()

结果:
小弟 17
明哥 19

解释:
在平时的线程中,应该每次打印的结果应该都是最后进来的线程的数据,即第一次的数据会被第二次的数据覆盖,
但是使用了local对象,可以实现线程的数据隔离,因此打印的两次结果都不一样。

原理:
local对象会创建一个大字典,字典的键是线程的id,值也是一个字典,存储数据,例如:

{
线程id1:{'name':'明哥',age:19}
线程id2:{'name':'小弟',age:17}
...
}

 

posted @ 2018-09-27 20:50  我用python写Bug  阅读(411)  评论(0)    收藏  举报