python 线程之threading.local()源码学习

在同一进程下,多个线程共享该进程的数据。为了保证数据的安全,多线程的写操作将被锁定,这意味着在多线程模式下效率会降低。

[En]

Under the same process, multiple threads share the data of the process. in order to ensure the security of the data, the write operation of the multi-thread will be locked, which means that the efficiency will be reduced under the multi-thread model.

threading.local()可以为每个线程创建局部名称空间,threading.local()是全局的,所有的线程都能访问,但是放入threading.local()对象中的属性数据不会被其它线程干扰.

threading.local实现线程数据隔离的主要原理,是通过一个大字典实现,大字典key值报存线程的id,value是一个小字典,保存该线程局部变量组成的字典。

知识储备:

1、slots__变量:

作用实例化时限制__dict__属性,每次实例化都需要新分配一个dict,因此在大量实例化该类的时候,存在空间浪费;如果类的属性确定,可通过__slots__变量来进行限制,配置__slots__后,只有__slots__中的属性能够动态增加和修改,不能再增加别的属性,不再有__dict

2、contextmanager上下文管理器

from contextlib import contextmanager

contextmanager作为上下文管理器,主要是为某些逻辑执行前做预准备工作以及某些逻辑执行后的善后工作。

contextmanager主要实现两个方法__enter__(被管理的逻辑执行前执行)和__exit__(被管理的逻辑执行后执行),可以直接自定义这两个函数,实现自定义上下文管理器。

使用contextmanager来注解某个函数后,可以通过with来调用,yeild前的内容相当于__enter__,yelid后的内容相当于__exit__;在函数中遇到yield时,在yield处停止,并把yield后的值返回。当执行完with的所有的语句后,再执行yield后面的语句

3、python弱引用weakref

python的垃圾回收主要使用引用计数、标记清除、分代回收机制;python为每个对象维护一个引用计数器,当引用被创建或复制时,引用计数器+1,当对象被销毁时引用计数器-1,为0意味着没有引用,会释放内存。

标签清理:解决循环引用问题

[En]

Tag cleanup: resolving the problem of circular references

逐代回收:以空间换时间,提高垃圾收集效率;生存时间越长,扫描间隔越长,减少频繁扫描带来的资源消耗

[En]

Generation-by-generation recycling: space for time to improve garbage collection efficiency; the longer the survival, the longer the scanning interval, reducing the resource consumption caused by frequent scanning

而通过调用weakref模块的ref创建对象的弱引用,不会产生引用计数,却可以操作指向的对象。

threading.local()源码分析:

threading.local类使用一个_localimpl类,来作为各个线程局部变量的管理类,该类的作用用来保存各个线程局部变量,通过大字典的形式;对_localimpl的操作,实际是对局部变量大字典的操作

_localiml线程管理类的主要作用就是创建或者获取到线程局部变量字典

{ id(Thread) -> (ref(Thread), thread-local dict) }

id(线程1):(ref(Thread), 线程1局部变量字典), …

local类中通过__slots__变量定义了两个变量 _local__impl和__dict__,_local__impl用来保存上述局部变量管理类_localimpl,dict__则保存local类自己的成员函数或变量,可以通过self.xxx来引用到。local类中重载了__getattribute、setattr、__delattr__等函数,通过重载这些函数,将local类中的__dict__对象指向了_local__impl中保存的该线程的局部变量字典,对local类进行赋值和获取操作时,实际上是对_local__impl中保存的该线程的局部变量字典进行操作。

Original: https://blog.51cto.com/u_13691477/5535889
Author: Rickyyan
Title: python 线程之threading.local()源码学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504535/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CSS 网格 Gird 布局

    通过将属性 display 的值设为 grid,HTML 元素就可以变为网格容器。 注意: 在 CSS 网格中,父元素称为容器(container),它的子元素称为项(items)…

    Python 2023年6月9日
    0110
  • 第三方库

    Python拥有活跃的贡献者和用户支持社区,并且根据开放源代码许可条款,其软件可供其他Python开发人员使用,这是python之所以这么受欢迎的原因之一。 第三方库就是非pyth…

    Python 2023年6月11日
    085
  • Python基础语法(十四)–对象之类方法和静态方法

    类对象 class Tools: # 定义类&a…

    Python 2023年6月10日
    096
  • conda虚拟环境创建、删除、查看等操作

    文章目录 1、创建虚拟环境 2、查看创建的虚拟环境 3、删除创建的虚拟环境 4、安装指定环境的package 使用Anaconda创建虚拟环境 好处:每次新建工程时直接新建一个虚拟…

    Python 2023年9月8日
    0152
  • 利用OpenCV检测人脸(python实现)

    摘要:人脸识别( Face Recognition)是当前一项非常热门的研究领域。这里介绍采用图像处理中的强大工具 OpenCV_实现简单的图片中人脸的检测,并在图像中标记出感兴趣…

    Python 2023年10月29日
    070
  • PageObject(PO)设计模式在 UI 自动化中的实践总结(以 QQ 邮箱登陆为例)

    Original: https://www.cnblogs.com/chengzi-ceba/p/16230074.htmlAuthor: 橙子~测试开发Title: PageOb…

    Python 2023年11月2日
    0105
  • python–连接oracle数据库

    前言 在进行数据库连接之前,一般都需要导入依赖的库,通过专门的库去处理对应的数据库连接,所以没安装对应的处理库的话,需要先进行安装、再导入,导入后即可正常使用。 一、安装cx_Or…

    Python 2023年8月2日
    089
  • 葫芦侠:一键签到云函数 超详细教程

    前言 此代码搬运吾爱破解@fuxi ,而我做这个博客就是记录一些可以使用函数签到的教程,不喜勿喷 教程 1、腾讯云函数地址:https://cloud.tencent.com/lo…

    Python 2023年6月10日
    0133
  • 一元钱注册 chatGPT账号

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月3日
    0101
  • item-scrapy框架5-python

    Item主要的目标是从数据源,典型的如网页,提取结构化的数据。Spiders可以Item(python定义键值对形式的对象)返回提取好的数据。 scrapy通过itemadapte…

    Python 2023年10月2日
    0116
  • 基于tensorflow-gpu的果蔬识别系统搭建过程及遇到的问题

    基于tensorflow-gpu的果蔬识别系统搭建过程及遇到的问题 * – 1 简介 – 2 环境搭建 – + 2.1 Pycharm安装 + …

    Python 2023年9月9日
    0110
  • 【Flask框架】——16 Jinja2模板

    文章目录 Jinja2模板 * 一、Jinja2模板介绍 – 1.模板传参 2.语法 二、表达式 三、控制语句 – 1.条件判断语句 2.for循环语句: …

    Python 2023年8月9日
    0111
  • 《Flask web 开发从入门到精通》读书笔记(下)

    《Flask web 开发从入门到精通》读书笔记(下) 第 6 章 Flask中的身份验证机制 * 6.1 创建简单的基于会话的身份验证 6.2 基于Flask-Login扩展的身…

    Python 2023年8月10日
    096
  • Python爬虫深造篇(三)——Scrapy爬虫框架精文

    一、前情提要 为什么要使用Scrapy 框架? 前两篇深造篇介绍了多线程这个概念和实战👇多线程网页爬取多线程爬取网页项目实战 经过之前的学习,我们基本掌握了分析页面、分析动态请求、…

    Python 2023年10月4日
    088
  • K-MEANS聚类——Python实现

    一、概述 (1 )物以类聚,人以群分,聚类分析是一种重要的多变量统计方法,但记住其实它是一种数据分析方法,不能进行统计推断的。当然,聚类分析主要应用在市场细分等领域,也经常采用聚类…

    Python 2023年8月1日
    096
  • 设计了一个自动归档工具

    背景 随着业务的发展,一些事务类表(源源不断产生业务数据)会越来越大,最终演变成我们说的大表,普通的查询可能毫秒级、秒级返回,但是稍微复杂的就会超时,甚至占满数据库cpu,进而导致…

    Python 2023年10月20日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球