阅读目录:

为什么设计上下文这样的机制?

就是保证多线程环境下,实现线程之间的隔离.

 

在了解flask上下文机制之前,我们先了解下线程的数据安全.

线程安全:

一起阅读flask上下文

如上代码段,在1s内开启20个线程,执行add_num(),结果foo.num都为 19,说明线程间数据是不隔离的.

一起阅读flask上下文

那么,如何保证线程间数据隔离呢? 有一种 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()
View Code

相关文章:

  • 2022-01-10
  • 2022-12-23
  • 2021-11-04
  • 2021-09-09
  • 2021-07-18
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-21
  • 2022-12-23
  • 2021-09-29
  • 2021-11-01
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案