自定义threading.local
1.threading相关。
# Author:Jesi
# Time : 2018/12/28 14:21
import threading
import time
from threading import local '''作用:为每个线程创建一个独立的空间,让线程与线程之间的数据做了一个隔离'''
obj = local() def task(i):
obj.xxx=i
time.sleep(1)
print(threading.get_ident(),i)
print(obj.xxx) for i in range(10):
t=threading.Thread(target=task,args=(i,))
t.start()
print(threading.get_ident) '''如何获取一个线程的唯一表示(类似于pid)'''
2.local的基本实现原理:
# Author:Jesi
# Time : 2018/12/28 14:41
import threading
import time '''
threading.local实现基本原理
''' DIC={} def task(i):
ident = threading.get_ident()
if ident in DIC:
DIC[ident]['xxx'] = i
else:
DIC[ident] = {'xxx':i}
time.sleep(2)
print(DIC)
print(DIC[ident]['xxx'],i)
'''
{
30800: {'xxx': 0},
25808: {'xxx': 1},
31416: {'xxx': 2},
30368: {'xxx': 3},
31620: {'xxx': 4},
30828: {'xxx': 5},
27888: {'xxx': 6},
22396: {'xxx': 7},
30780: {'xxx': 8},
30856: {'xxx': 9}
}
''' for i in range(10):
t=threading.Thread(target=task,args=(i,))
t.start()
3.自定义一个local,在Flask中就是这么实现的
# Author:Jesi
# Time : 2018/12/28 14:56
import threading
import time
import greenlet try:
get_ident = greenlet.getcurrent
except Exception as e:
get_ident = threading.get_ident class Local(object):
DIC = {} def __getattr__(self, item):
ident = get_ident()
if ident in self.DIC:
return self.DIC[ident].get(item)
return None def __setattr__(self, key, value):
ident = get_ident()
if ident in self.DIC:
self.DIC[ident][key] = value
else:
self.DIC[ident] = {key: value} obj = Local() def task(i):
obj.xxx = i
time.sleep(1)
print(obj.xxx, i) for i in range(10):
t = threading.Thread(target=task, args=(i,))
t.start()
自定义threading.local的更多相关文章
- Flask补充--threading.local对象
目录 Local 局部变量 全局变量 使用threading.local() 自定义threading.local 函数版 面向对象版 通过setattr和getattr实现 每个对象有自己的存储空间 ...
- threading.local和高级
threading.local特点 ①为每个线程开辟空间,让你进行存取值(根据线程ID来固定某个值) ②flask中没有threading.local,但是flask中的上下文管理的思想是借鉴的thr ...
- threading.local在flask中的用法
一.介绍 threading.local的作用: 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据的存储,而每块空间内的数据也不会错乱. 二.不使用threading. ...
- flask 源码专题(七):threading.local和高级
1.python之threading.local 当每个线程在执行 val.num=1 ,在内部会为此线程开辟一个空间,来存储 num=1 val.num,找到此线程自己的内存地址去取自己存储 num ...
- 03 flask源码剖析之threading.local和高级
03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...
- 多线程局部变量之threading.local()用法
假如,开了十个线程并且做同样的一件事,他们需要带着自己的数据进来,完成事情后带着自己的数据出去.如果是并发,同时进来,他们的数据就会混乱. 一般情况,我们加锁就可以了,一个人先进来,先加锁,另一个人过 ...
- flask上下文管理之threading.local
Flask之上下文管理 知识储备之问题情境: request中的参数: 单进程单线程 单进程多线程-->reqeust 会因为多个请求,数据发生错乱.--->可以基于threading.l ...
- threading.local()使用与原理剖析
threading.local()使用与原理剖析 前言 还是第一次摘出某个方法来专门写一篇随笔,哈哈哈. 为什么要写这个方法呢?因为它确实太重要了,包括后期的Flask框架源码中都有它的影子. 那么我 ...
- threading.local学习
多线程抢占问题 import time import threading obj = 5 def task(arg): global obj obj = arg time.sleep(1) print ...
随机推荐
- python shell与反弹shell
python shell与反弹shell 正常shell需要先在攻击端开机情况下开启程序,然后攻击端运行程序,才能连接 反弹shell,攻击端是服务端,被攻击端是客户端正常shell,攻击端是客户端, ...
- php5.4新功能Traits
php5.4新功能Traits介绍 1. traits Traits是在5.4中新增的一个用于实现代码重用的方法. php是一种单一继承的语言,我们无法像java一样在一个class中extends多 ...
- C# -- 索引器、枚举类型
C# -- 索引器.枚举类型 索引器允许类或结构的实例就像数组一样进行索引. 无需显式指定类型或实例成员,即可设置或检索索引值. 索引器类似于属性,不同之处在于它们的访问器需要使用参数. 1. 索引器 ...
- 平方根的C语言实现(一) —— 浮点数的存储
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7203254.html 作者:窗户 Q ...
- SQL INNER JOIN 关键字
SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行. INNER JOIN 关键字语法 SELECT column_name(s) FROM table ...
- icon图标库记录
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 阿里巴巴: http://iconfont.cn/ 可以下载图标 github : x ...
- P1396 营救(并查集+二分)
思路:检验函数中,先初始化每个节点的下标,每调用检验函数就从新使用一次并查集(并查集的时间复杂度非常低),然后,就看当一条路的价值val<=假设最大值x时,就把他们连接起来. #include& ...
- 【ES6】import, require,export
node编程中最重要的思想就是模块化,import和require都是被模块化所使用. 遵循规范 require 是 AMD规范引入方式 import是es6的一个语法标准,如果要兼容浏览器的话必须转 ...
- Spring Security(十七):5.8 Method Security
From version 2.0 onwards Spring Security has improved support substantially for adding security to y ...
- 初学Python——文件操作第二篇
前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...