阅读目录:
为什么设计上下文这样的机制?
就是保证多线程环境下,实现线程之间的隔离.
在了解flask上下文机制之前,我们先了解下线程的数据安全.
线程安全:
如上代码段,在1s内开启20个线程,执行add_num(),结果foo.num都为 19,说明线程间数据是不隔离的.
那么,如何保证线程间数据隔离呢? 有一种 threading.local 方法
Thread Local
threading.local 在多线程操作时,为每一个线程开辟一个空间来保存它的值,使得线程之间的值互不影响.
import time from threading import Thread,local class Foo(local): num = 0 foo = Foo() def add_num(i): foo.num = i time.sleep(1) print(i,foo.num) for i in range(20): task = Thread(target=add_num,args=(i,)) task.start()
也可以自定义一个线程安全: 定义一个全局字典,key为当前线程的线程ID,value为具体的值
import copy import time from threading import Thread,get_ident class Foo(): num = 0 foo = Foo() dic = {} def add_num(i): dic[get_ident()] = copy.copy(foo) dic[get_ident()].num = i time.sleep(1) print(get_ident(),dic[get_ident()].num) for i in range(5): task = Thread(target=add_num,args=(i,)) task.start()