1.示例代码

import time
import threading v = threading.local() def func(arg):
# 内部会为当前线程创建一个空间用于存储:phone=自己的值
v.phone = arg
time.sleep(2)
print(v.phone,arg) # 去当前线程自己空间取值 for i in range(10):
t =threading.Thread(target=func,args=(i,))
t.start()

2.原理

import time
import threading DATA_DICT = {} def func(arg):
ident = threading.get_ident()
DATA_DICT[ident] = arg
time.sleep(1)
print(DATA_DICT[ident],arg) for i in range(10):
t =threading.Thread(target=func,args=(i,))
t.start()

3.拓展

import time
import threading INFO = {} class Local(object): def __getattr__(self, item):
ident = threading.get_ident()
return INFO[ident][item] def __setattr__(self, key, value):
ident = threading.get_ident()
if ident in INFO:
INFO[ident][key] = value
else:
INFO[ident] = {key: value} # 实例化
obj = Local() def func(arg):
# 调用对象的 __setattr__方法(“phone”,1)
obj.phone = arg
time.sleep(2)
print(obj.phone, arg) if __name__ == '__main__':
for i in range(10):
t = threading.Thread(target=func, args=(i,))
t.start()

总结:

1.obj.x 调用方法__getattr__

2.obj.x = 6 调用方法__setattr__

4.作用

内部自动为每个线程维护一个空间(字典),用于当前存取属于自己的值。保证线程之间的数据隔离。

{

线程ID: {...}

线程ID: {...}

线程ID: {...}

线程ID: {...}

}

多线程threading.local的作用及原理?的更多相关文章

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

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

  2. threading.local的作用?

    threading.local()这个方法的特点用来保存一个全局变量,但是这个全局变量只有在当前线程才能访问,如果你在开发多线程应用的时候  需要每个线程保存一个单独的数据供当前线程操作,可以考虑使用 ...

  3. threading.local作用及原理

    先看下应用: import threading from threading import local import time obj = local() def task(i): obj.xxxxx ...

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

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

  5. threading.local在flask中的用法

    一.介绍 threading.local的作用: 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据的存储,而每块空间内的数据也不会错乱. 二.不使用threading. ...

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

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

  7. threading.local()使用与原理剖析

    threading.local()使用与原理剖析 前言 还是第一次摘出某个方法来专门写一篇随笔,哈哈哈. 为什么要写这个方法呢?因为它确实太重要了,包括后期的Flask框架源码中都有它的影子. 那么我 ...

  8. 多线程多进程学习threading,queue线程安全队列,线程间数据状态读取。threading.local() threading.RLock()

    http://www.cnblogs.com/alex3714/articles/5230609.html python的多线程是通过上下文切换实现的,只能利用一核CPU,不适合CPU密集操作型任务, ...

  9. flask上下文管理相关 - threading.local 以及原理剖析

    threading.local 面向对象相关: setattr/getattr class Foo(object): pass obj = Foo() obj.x1 = 123 # object.__ ...

随机推荐

  1. Java对象的浅克隆和深克隆

    为什么需要克隆      在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B, 并且此后对B任何改动都不会影响到A中的值 ...

  2. O(1)取Queue中的最大值

    实现原理: 1.利用Stack的先进后出的特性,实现一个MaxStack,MaxStack中用一个Stack记录当前的值,一个Stack记录当前的最大值. 2.用2个MaxStack实现MaxQueu ...

  3. CentOS 7下Java的SecureRandom种子初始化失败解决办法

    io.netty.util.internal.ThreadLocalRandom getInitialSeedUniquifierWARNING: Failed to generate a seed ...

  4. maven下载、配置和安装

    Maven简介 #Apache Maven is a software project management and comprehension tool. Based on the concept ...

  5. JavaScript中的对象冒充

    JavaScript里没有继承关键字,想要继承一个类需要用到“对象冒充”. <!DOCTYPE html> <html xmlns="http://www.w3.org/1 ...

  6. jmeter插件JMeterPlugins-Standard 压力测试

    Jmeter有插件提供用来给用户监控所测试的服务器的资源使用 情况,需要有Jmeter客户端插件和服务端插件 1.客户端插件 需要在https://jmeter-plugins.org/downloa ...

  7. Windows 动态库创建和使用 part 2

    一.Windows动态库的创建: 1.先选择 "DLL" 和 “控项目” 2.添加一个头文件,一个源文件  CppDll.h,CppDll.cpp,一个模块定义文件 CppDll. ...

  8. 安装Node.js以及Hexo

    安装前提 安装 Hexo 相当简单.然而在安装前,您必须检查电脑中是否已安装下列应用程序: Node.js 如何在Ubuntu上安装最新版本的Node.js https://hexo.io/zh-cn ...

  9. wireshark in text mode: tshark

    tshark -i <interface> -w "output.data" 抓到的数据可用wireshark打开查看.

  10. Java序列化(转载)

    引用自:http://developer.51cto.com/art/201506/479979_all.htm 关于 Java 对象序列化您不知道的 5 件事 数年前,当和一个软件团队一起用 Jav ...