当前位置: 首页 > news >正文

python学习笔记 - ThreadLocal

我们在编写多线程程序的时候,往往会遇到两种类型的变量。

  • 一种是全局变量,多个线程共享。为了避免改乱为,我们在前面已经提到说要加锁。

  • 一种是局部变量。仅供一个线程使用,线程间相互不影响。

例如下列程序中task()函数中定义的count变量就是局部变量。即使我们创建了两个线程,两者的count递增也不会相互影响,因为count是在task中定义的。

import threading


def task():
    count = 0
    for i in range(1000):
        count += 1
        print count


if __name__ == '__main__':
    t1 = threading.Thread(target=task)
    t1.start()
    t2 = threading.Thread(target=task)
    t2.start()

那么,这么处理是不是就完美了呢?其实还不是。
以上的例子我们举的是一个非常简单的例子,但是我们遇到一个比较复杂的业务逻辑的时候,比如多个局部变量,函数多重调用等,这么定义局部变量就会变得不简洁,麻烦。
函数多重调用是指,例如:
我们定义了函数,methodA(),这个方法体内调用了methodB(), methodB()方法体中又调用了methodC()...
如果我们在某一个线程中调用了methodA()并且使用了一个变量attr,那么我们就需要将attr一层一层地传递给后续的函数。

有没有一种方法,能让我们在线程中定义一个变量后,那么这个线程中的函数就都能调用,如此才叫简洁明了?
Python为我们做到了,那就是ThreadLocal.
ThreadLocal的用法只需要三步:

  • 定义一个对象 threading.local

  • 在线程内给该对象绑定参数。所有绑定的参数都是线程隔离的。

  • 在线程内调用。

下面展示一下代码:

# coding=utf-8
import threading

local = threading.local() # 创建一个全局的对象


def task():
    local.count = 0  # 初始化一个线程内变量,该变量线程间互不影响。
    for i in range(1000):
        count_plus()


def count_plus():
    local.count += 1
    print threading.current_thread().name, local.count


if __name__ == '__main__':
    t1 = threading.Thread(target=task)
    t1.start()
    t2 = threading.Thread(target=task)
    t2.start()

相关文章:

  • ettercap dns_spoof
  • TYVJ1860 后缀数组
  • 【Spark Summit EU 2016】Spark与Couchbase——使用Spark扩展数据库操作
  • shell中的read命令详解
  • Effective C++ 笔记
  • Python MySQLdb在Linux下的快速安装
  • Python通过ssh连接服务器并执行命令
  • Oracle附录——Oracle事务
  • 微信小程序 view 布局
  • 首篇
  • 查看数据库字符集
  • vagrant 添加本地 box 安装 laravel homestead
  • eclipse(luna)创建web工程
  • Vim 折腾记
  • $.ajax()
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【个人向】《HTTP图解》阅后小结
  • 2019年如何成为全栈工程师?
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • django开发-定时任务的使用
  • ECMAScript入门(七)--Module语法
  • es的写入过程
  • exports和module.exports
  • github从入门到放弃(1)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python进阶细节
  • Redis在Web项目中的应用与实践
  • SpringCloud集成分布式事务LCN (一)
  • 阿里云前端周刊 - 第 26 期
  • 大整数乘法-表格法
  • 关于springcloud Gateway中的限流
  • 基于组件的设计工作流与界面抽象
  • 简单基于spring的redis配置(单机和集群模式)
  • 模型微调
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 如何正确理解,内页权重高于首页?
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​卜东波研究员:高观点下的少儿计算思维
  • # 数论-逆元
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #数学建模# 线性规划问题的Matlab求解
  • (007)XHTML文档之标题——h1~h6
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Java)【深基9.例1】选举学生会
  • (solr系列:一)使用tomcat部署solr服务
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (阿里云万网)-域名注册购买实名流程
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • *** 2003
  • .net mvc 获取url中controller和action