threading.local特点

①为每个线程开辟空间,让你进行存取值(根据线程ID来固定某个值)

②flask中没有threading.local,但是flask中的上下文管理的思想是借鉴的threading.local.

③在线程关闭之前值保持不变,线程关闭后值就清空了.

普通多线程

import time
import threading class Foo(object):
        def __init__(self):
                self.num = 0 val2 = Foo() def task(i):
        val2.num = i
        time.sleep(1)
        print(val2.num) for i in range(4):
        t = threading.Thread(target=task,args=(i,))
        t.start() 结果:
3
3
3
3
4个值全一样

threading.local多线程

import time
import threading
# 当每个线程在执行 val1.xx=1 ,在内部会为此线程开辟一个空间,来存储 xx=1
# val1.xx,找到此线程自己的内存地址去取自己存储 xx
val1 = threading.local() def task(i):
        val1.num = i
        time.sleep(1)
        print(val1.num) for i in range(4):
        t = threading.Thread(target=task,args=(i,))
        t.start 输出结果:
0
1
2
3
四个结果不同

自定义threading.local

import threading
"""
storage = { #自定义的维护一个这样的字典
1111:{'x1':0},
1112:{'x1':1}
1113:{'x1':2}
1114:{'x1':3}
1115:{'x1':4}
}
"""
class Local(object):
        def __init__(self):
                object.__setattr__(self,'storage',{})         def __setattr__(self, key, value):
                ident = threading.get_ident() #这个就是线程id
                if ident in self.storage:
                        self.storage[ident][key] = value
                else:
                        self.storage[ident] = {key:value}         def __getattr__(self, item):
                ident = threading.get_ident() #这个就是线程id
                if ident not in self.storage:
                        return
                return self.storage[ident].get(item) local = Local() def task(arg):
        local.x1 = arg
        print(local.x1) for i in range(5):
        t = threading.Thread(target=task,args=(i,))
        t.start() 输出:
0
1
2
3
4

会根据你不同的线程ID来输出不同的值

加强版自定义threading.local

flask的上下文管理就这样

原来维护的是一个字典里面还是字典:
"""
storage = {
1111:{'x1':0},
1112:{'x1':1}
1113:{'x1':2}
1114:{'x1':3}
1115:{'x1':4}
}
"""
加强版维护的是一个字典里面是字典加列表:
"""
storage = {
1111:{'x1':[0,1]},
1112:{'x1':[0,1,2]}
1113:{'x1':[0,1,3]}
1114:{'x1':[0,1,5]}
1115:{'x1':[0,1,6]}
}
"""
这个维护的列表要当做栈(append往里加,如果是取值就用[-1],要是拿走值就用pop)来使用,后进先出 import threading
"""
storage = {
1111:{'x1':[]},
1112:{'x1':[]}
1113:{'x1':[]}
1114:{'x1':[]}
1115:{'x1':[]},
1116:{'x1':[]}
}
"""
class Local(object):
        def __init__(self):
                object.__setattr__(self,'storage',{})         def __setattr__(self, key, value):
                ident = threading.get_ident()
                if ident in self.storage:
                        self.storage[ident][key].append(value)
                else:
                        self.storage[ident] = {key:[value,]}         def __getattr__(self, item):
                ident = threading.get_ident()
                if ident not in self.storage:
                        return
                return self.storage[ident][item][-1] local = Local() def task(arg):
        local.x1 = arg
        print(local.x1) for i in range(5):
        t = threading.Thread(target=task,args=(i,))
        t.start()
输出:
0
1
2
3
4

threading.local和高级的更多相关文章

  1. 03 flask源码剖析之threading.local和高级

    03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...

  2. flask 源码专题(七):threading.local和高级

    1.python之threading.local 当每个线程在执行 val.num=1 ,在内部会为此线程开辟一个空间,来存储 num=1 val.num,找到此线程自己的内存地址去取自己存储 num ...

  3. 自定义threading.local

    1.threading相关. # Author:Jesi # Time : 2018/12/28 14:21 import threading import time from threading i ...

  4. threading.local学习

    多线程抢占问题 import time import threading obj = 5 def task(arg): global obj obj = arg time.sleep(1) print ...

  5. Threading.local

    在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. Threading.local可以创建 ...

  6. 网络编程 多线程/socketserver模块/ threading.local

    线程:进程中负责程序执行的执行单元. 多线程:在1个进程中存在多个线程. 进程只是用来把资源集中在一起,而线程才是cpu上的执行单位. 每个进程都会默认有一个控制线程也叫作主线程. 进程之间是竞争关系 ...

  7. 多线程局部变量之threading.local()用法

    假如,开了十个线程并且做同样的一件事,他们需要带着自己的数据进来,完成事情后带着自己的数据出去.如果是并发,同时进来,他们的数据就会混乱. 一般情况,我们加锁就可以了,一个人先进来,先加锁,另一个人过 ...

  8. python之threading.local

    简述: threading.local是全局变量但是它的值却在当前调用它的线程当中 作用: 在threading module中,有一个非常特别的类local.一旦在主线程实例化了一个local,它会 ...

  9. [Python 多线程] threading.local类 (六)

    在使用threading.local()之前,先了解一下局部变量和全局变量. 局部变量: import threading import time def worker(): x = 0 for i ...

随机推荐

  1. MongoDB远程连接-命令行客户端mongo.exe

    命令行客户端mongo.exe 位于安装目录bin子目录下.MongoDB的所有可执行程序都在其中. 双击打开mongo.exe应该是默认连接本地数据库服务,因此需要用Cmd或Powershell的方 ...

  2. 洛谷 P1825 【[USACO11OPEN]玉米田迷宫Corn Maze】

    P1825 传送门 简单的题意 就是一个有传送门的迷宫问题(我一开始以为是只有1个传送门,然后我就凉了). 大体思路 先把传送门先存起来,然后跑一下\(BFS\). 然后,就做完了. 代码鸭 #inc ...

  3. Java接口、lambda的学习

    接口的实现  :  使用interface定义:形式如下 interface Printable{ final int MAX = 100; void add(); float sum(float x ...

  4. 【CF55D】Beautiful numbers

    [CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\ ...

  5. mac下 Eclipse代码自动补齐 设置

    Eclipse -> Perferences -> Java -> Editor -> Content Assist如下图. 将auto activation triggers ...

  6. 前端微服务初试(singleSpa)

    1.基本概念 实现一套微前端架构,可以把其分成四部分(参考:https://alili.tech/archive/11052bf4/) 加载器:也就是微前端架构的核心,主要用来调度子应用,决定何时展示 ...

  7. Spring Boot 之配置导入,强大到不行!

    我们知道在 Spring Boot 中可以用一个 @Configuration 配置文件来配置所有 Bean 及其他配置(不会的看这篇文章:Spring零配置之@Configuration注解详解), ...

  8. Spring Cloud Hystrix基本原理

    本篇学习Spring Cloud家族中的重要成员:Hystrix.分布式系统中一个服务可能依赖着很多其他服务,在高并发的场景下,如何保证依赖的某些服务如果出了问题不会导致主服务宕机这个问题就会变得异常 ...

  9. Windows系统中CreateFileMapping实现的共享内存及用法

    在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...

  10. centos7安装yum

    由于不小心把自带的yum给卸载了,卸载命令:rpm -qa yum: 在浏览器打开链接:http://mirrors.163.com/centos/6/os/x86_64/Packages/下载这四个 ...