03 threading.local和高级

1.python之threading.local

  • 当每个线程在执行 val.num=1 ,在内部会为此线程开辟一个空间,来存储 num=1

  • val.num,找到此线程自己的内存地址去取自己存储 num

    import time
    import threading val1 = threading.local() def task(i):
    val.num = i
    time.sleep(1)
    print(val.num) for i in range(4):
    t = threading.Thread(target=task,args=(i,))
    t.start()

2. 线程唯一标识

  • get_ident

    import threading
    from threading import get_ident def task():
    ident = get_ident()
    print(ident)
    for i in range(20):
    t = threading.Thread(target=task)
    t.start()

3. 自定义threading.local

  • 储存结构:

    storage = {

    1112:{'x1':1}

    1113:{'x1':2}

    1114:{'x1':3}

    1115:{'x1':4}

    }

    import threading
    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] = 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].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()

4. 加强版threading.local

  • 储存结构:

    storage = {

    1111:{'x1':[]},

    1112:{'x1':[]}

    1113:{'x1':[]}

    1114:{'x1':[]}

    1115:{'x1':[]},

    1116:{'x1':[]}

    }

    import threading
    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()

03 flask源码剖析之threading.local和高级的更多相关文章

  1. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  2. 08 Flask源码剖析之flask拓展点

    08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...

  3. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  4. flask 源码剖析

    flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一  偏函数_mro [flask源码梳理]之二  面向对象中__setattr__ [flask源码梳理]之三  Local ...

  5. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

  6. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

  7. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  8. 06 flask源码剖析之路由加载

    06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...

  9. flask源码剖析--请求流程

    想了解这篇里面的内容,请先去了解我另外一篇博客Flask上下文 在了解flask之前,我们需要了解两个小知识点 偏函数 import functools def func(a1,a2): print( ...

随机推荐

  1. [转] Ubuntu的apt-get 设置代理的方法

    点击阅读原文 新立得软件管理器这种图形化的代理设置很明了,这里介绍下终端命令行的网络代理设置,这样大家就可以通过代理进行apt-get了. 方法一: 如果只是想临时使用http代理,可以在使用apt- ...

  2. 2019-02-13 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?

    题目: 现在有1000瓶药水,其中一瓶有毒,一只老鼠喝了在24h后会准时死亡,药水无色无味,如何用最少的老鼠在24h内找出毒药? 分析: 时间限制为24h,说明我们只有一次喂老鼠的机会,需要一波找出来 ...

  3. Idea 添加注释:类注释、方法注释(可获取参数)

    原文链接:https://blog.csdn.net/liqing0013/article/details/84104419 Idea 添加注释:类注释.方法注释 类注释 File–Setting–E ...

  4. MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字

    MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字 stdafx.h文件中添加:#include "afxsock.h" BOOL CMFC_TCP_Client_c ...

  5. 本地yum源及更新

    创建本地yumrepo源 概述 在生产环境中,由于网络环境隔离,很多内网机器,无法直接通过网络下载安装相关软件包,所以这个时候就需要在内网搭建一个yum源,然后通过下载将需要的软件包rpm下载下来,然 ...

  6. Redis:缓存淘汰策略

    将redis用做缓存是一种非常常见的手段,然而由于内存大小的限制,会导致redis在内存空间满了以后需要处理继续存入的数据.总计有以下几种策略: volatile-ttl:在设置了过期时间的数据集里, ...

  7. vue全家桶(2.3)

    3.4.嵌套路由 实际生活中的应用界面,通常由多层嵌套的组件组合而成.同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如: 再来看看下面这种更直观的嵌套图: 接下来我们需要实现下面这种 ...

  8. jmeter跨线程组获取cookie或jmeter线程组共享cookie-笔者亲测

    一.Jmeter版本 此次示例采用的是apache-jmeter-5.2.1版本 二.设置配置文件使Cookie管理器保存cookie信息. 修改apache-jmeter-5.2.1/bin/jme ...

  9. ORACLE误删除表数据或误更新/插入数据如何恢复

    工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料   PL/SQL 方法/步骤     首先新建一张测试表TEST,里面输入记录.由于删除/更 ...

  10. CentOS 7 内核更新后删除旧内核(转载)

    CentOS 7 内核更新后删除旧内核 0.当前 # uname -sr Linux 3.10.0-123.20.1.el7.x86_64 1.搜索查询 # rpm -q kernel kernel- ...