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. git环境配置 | GitHub

    注册完GitHub之后,需要配置git,其主要的目的是为了方便文件的上传.下载等. 一. git下载 https://git-scm.com/downloads 在git官网找到相应版本的git下载安 ...

  2. Android学习笔记BroadcastReceiver(广播接收者)

    Android发送广播的过程 代码实现 MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androi ...

  3. 【JMeter_11】JMeter逻辑控制器__Switch控制器<Switch Controller>

    Switch控制器<Switch Controller> 业务逻辑: 取得switch value的值,通过对节点下所有取样器.逻辑控制器的下标.名称匹配去执行,switch value的 ...

  4. Linux MySQL集群搭建之主从复制

    前期准备 准备两台Linux,一主,一从,具体Linux安装MySQL操作步骤:点我直达 集群搭建 注意事项 一主可以多从 一从只能一主 关闭主从机器的防火墙策略 chkconfig iptables ...

  5. K8S-磁盘配额管理-整理

    1.  ephemeral-storage介绍 Kubernetes在1.8的版本中引入了一种类似于CPU,RAM的新的资源模式:ephemeral-storage属性(直译为临时存储),并且在1.1 ...

  6. 多语言工作者の十日冲刺<4/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第四天(05.03) 作业正文 ...

  7. 强大的IntelliJ IDEA怎么破解?

    IntelliJ IDEA是非常好用的一个开发工具,怎么样才可以破解也是非常关键的问题,本文简单介绍破解方法. 第一种方式,我们进入以下网站http://idea.lanyus.com/ 这里要注意一 ...

  8. 我是如何从零学习开发一款跨平台桌面软件的(Markdown编辑器)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 原始冲动 最近一 ...

  9. 09.spring框架整合junit

    在正常的实际开发中都是按照上面这种方式来进行管理的.

  10. 基于 Angular Material 的 Data Grid 设计实现

    自 Extensions 组件库发布以来,Data Grid 成为了使用及咨询最多的组件.最开始 Data Grid 的设计非常简陋,经过一番重构,组件质量有了质的提升. Extensions 组件库 ...