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. dbca oracle 12 c 遇到ora27125

    网上大部分方法是把dba组放在内核的,没有效果,可以尝试 google找到一位大神的方案,成功解决 https://oracle-admin.com/2014/01/22/ora-27125-unab ...

  2. Spring:工厂模式哪里解耦了?

    菜瓜:我一定是太菜了,为什么别人说Spring屏蔽了new关键字创建对象就很丝滑?我完全get不到这个操作的好处啊,我自己写new它也很香啊 水稻:emmmm,换个角度想啊,如果把现在用的注解@Aut ...

  3. 大厂面试过程复盘(微信/阿里/头条均拿offer,附答案篇)

    背景 本人前端,3年经验,由于个人的原因,决定跳槽,于是大概3月开始找工作,总历时大概2个月,面试了微信/阿里/头条,三家都拿到了offer,来分享一下面经. 问题比较多,而且很多面试题都是跟个人项目 ...

  4. Linux MySQL Proxy 读写分离

    导读 因为读写分离是建立在MySQL集群主从复制的基础上,还不了解的,先看我另一篇博客:点我直达 MySQL-Proxy简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接 ...

  5. 第二章、Web中使用shiro(实现登陆)

    虽然Apache Shiro的核心设计目标允许它用于保护任何基于JVM的应用程序(如命令行应用程序,服务器守护程序,Web应用程序等),但本指南将着重讨论最常见的用例:确保运行的Web应用程序一个Se ...

  6. JavaWeb网上图书商城完整项目--day02-8.提交注册表单功能之dao、service实现

    1.发送邮件 发送邮件的时候的参数我们都写在了配置文件中,配置文件放在src目录下,可以使用类加载器进行加载该数据 //向注册的用户发送邮件 //1读取配置文件 Properties properti ...

  7. 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

    1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject { publ ...

  8. 彻底搞懂Redis主从复制原理及实战

    欢迎关注公众号:「码农富哥」,致力于分享后端技术 (高并发架构,分布式集群系统,消息队列中间件,网络,微服务,Linux, TCP/IP, HTTP, MySQL, Redis), Python 等 ...

  9. SDL软件安全读书笔记(一)

    # 如何应对当前的全球网络安全威胁? 开发安全漏洞尽可能少的软件,应该着眼于源头安全. 边界安全盒深度防御是重要的安全手段,但软件自身的安全是安全防护的第一关. 即使软件源头存在较少的漏洞,这些漏洞也 ...

  10. 平时Chrome中用的一些插件

    一.chrome://extensions Adblock Plus Dark Reader 让网站黑色主题 Infinity 新标签页 一个比较流行的新标签页工具 GNOME Shell integ ...