自定义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 ...
随机推荐
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
- echo '1'.print(2)+3; 的输出结果为什么是511
今天看到一道有趣的题目,如上所示.结果为什么会是511呢? 这个结果的计算分为三步来理解: 首先计算的是 右边print(2)+3,这个你可以直接理解成print(2+3),得到的结果是5.而prin ...
- Unittest框架小结
在日常的自动化测试过程中,Python里有一个自带的单元测试框架是unittest模块,简单易用,这里简单介绍下其主要的用法. Unittest测试框架主要包含四个部分 TestCase 也就是测试用 ...
- SecureCRT8.1+SecureCRT_keygen完成注册
原文:https://www.cnblogs.com/qiyawei/p/7822957.html 1.下载完secureCRT8.1之后,进行安装. 点击secureCRT.exe的时候会出现如下图 ...
- C#反射の反射泛型
C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转) 接上篇. 自定义一个泛型类(继承于接口) public ...
- <转> mysql处理高并发,防止库存超卖
先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购 一个商品.然而,作为活动商品,库存肯定是很有限的,如何 ...
- 第一章 mysql的体系结构与存储引擎
数据库从逻辑上可以分为两部分,一部分负责存储即文件系统,这部分有个更时髦的名字叫存储引擎,存储引擎负责如何把数据以及索引相关的内容以合适的形式组织并存储到磁盘上.另一部分为server部分,负责和用户 ...
- len()方法
len() 方法返回对象(字符.列表.元组等)长度或项目个数 len()方法语法: len( 对象 )
- 【js】横/纵向无缝滚动
1.纵向无缝滚动(类似淘宝) ps:存在一个问题,当鼠标移入时,未关闭定时器 <!DOCTYPE html> <html> <head> <meta char ...
- ActiveMQ的queue以及topic两种消息处理机制分析
1 queue与topic的技术特点对比 对比项 Topic Queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状 ...