Python线程(四)ThreadLocal的使用

1人阅读 评论(0) 收藏 举报
分类:

在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。

  1. 使用函数传参的方法
def process_student(name):
    std = Student(name)
    # std是局部变量,但是每个函数都要用它,因此必须传进去:
    do_task_1(std)
    do_task_2(std)

def do_task_1(std):
    do_subtask_1(std)
    do_subtask_2(std)

def do_task_2(std):
    do_subtask_2(std)
    do_subtask_2(std)

但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦
2. 使用全局字典的方法

global_dict = {}

def std_thread(name):
    std = Student(name)
    # 把std放到全局变量global_dict中:
    global_dict[threading.current_thread()] = std
    do_task_1()
    do_task_2()

def do_task_1():
    # 不传入std,而是根据当前线程查找:
    std = global_dict[threading.current_thread()]
    ...

def do_task_2():
    # 任何函数都可以查找出当前线程的std变量:
    std = global_dict[threading.current_thread()]
    ...

这种方式理论上是可行的,它最大的优点是消除了std对象在每层函数中的传递问题,但是,每个函数获取std的代码有点low。

有没有更简单的方式?

  1. 使用ThreadLocal的方法
    ThreadLocal应运而生,不用查找dict,ThreadLocal帮你自动做这件事:
import threading

# 创建全局ThreadLocal对象:
local_school = threading.local()

def process_student():
    # 获取当前线程关联的student:
    std = local_school.student
    print('Hello, %s (in %s)' % (std, threading.current_thread().name))

def process_thread(name):
    # 绑定ThreadLocal的student:
    local_school.student = name
    process_student()

t1 = threading.Thread(target= process_thread, args=('dongGe',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('老王',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()

执行结果:

Hello, dongGe (in Thread-A)
Hello, 老王 (in Thread-B)

说明
全局变量local_school就是一个ThreadLocal对象,每个Thread对它都可以读写student属性,但互不影响。你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理。

可以理解为全局变量local_school是一个dict,不但可以用local_school.student,还可以绑定其他变量,如local_school.teacher等等。

ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。

  1. 小结
    一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题
查看评论

python线程进程、异步IO

多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间 执行多于一个线程,进而提升整体处理性能。 该章节主要包括线程进程的概念,基于python的线程进程实现,GIL锁的影响,消费者生产者模型,进程池的应用以及IO模型的介绍,一句话概括本章的内容就是:实现并发编程,即计算机能够同时处理多个任务。
  • 2017年03月06日 18:23

ThreadLocal的使用,保证每一个线程都有自己的共享变量。

变量的共享可以使用public static 修饰,所有的线程都使用同一个public static 变量,那如何实现每一个线程都有自己的共享变量呢,ThradLocal类就是干这个用的。 pack...
  • liuyifeng1920
  • liuyifeng1920
  • 2016-11-16 14:56:23
  • 1596

Java并发编程-线程局部变量(ThreadLocal)

ThreadLocal与线程成员变量还有区别,ThreadLocal该类提供了线程局部变量。这个局部变量与一般的成员变量不一样,ThreadLocal的变量在被多个线程使用时候,每个线程只能拿到该变量...
  • chenchaofuck1
  • chenchaofuck1
  • 2016-06-05 14:45:24
  • 1526

线程局部变量ThreadLocal的简单使用

今天来说说ThreadLocal的使用: 什么是ThreadLocal:ThreadLocal是线程局部变量,所谓的线程局部变量,就是仅仅只能被本线程访问,不能在线程之间进行共享访问的变量。在各...
  • u011276324
  • u011276324
  • 2017-03-27 10:49:19
  • 467

多线程中的ThreadLocal 详解

要了解ThreadLocal,首先搞清楚ThreadLocal 是什么?是用来解决什么问题的?ThreadLocal 是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问, 通常是类...
  • woshiluoye9
  • woshiluoye9
  • 2017-05-19 16:49:42
  • 416

【ThreadLocal模式】线程上的全局变量

运用ThreadLocal模式的场景: 1.频繁创建生命周期短暂的实例(或者实例化代价昂贵)导致性能低下 2.需要线程安全,使用‘synchronized’线程同步同样导致性能低下 以下是Tim Cu...
  • tanxiang21
  • tanxiang21
  • 2013-05-15 16:54:19
  • 3849

ThreadLocal遇到线程池时, 各线程间的数据会互相干扰, 串来串去

最近遇到一个比较隐蔽而又简单地问题,在使用ThreadLocal时发现出现多个线程中值串来串去,排查一番,确定问题为线程池的问题,线程池中的线程是会重复利用的,而ThreadLocal是用线程来做Ke...
  • cxh5060
  • cxh5060
  • 2015-10-20 12:16:32
  • 2783

浅析Java中通过ThreadLocal实现线程绑定来传递参数

ThreadLocal浅解 ThreadLocal的基本理解 Threadlocal很多地方都叫线程本地变量,也有很多地方叫线程本地存储,个人理解在业务上方法调用方法时都是在单线程中进行操作,在进行...
  • Geeker_Yan
  • Geeker_Yan
  • 2017-12-11 23:45:36
  • 393

Java多线程探究-线程局部变量ThreadLocal

TheadLocal可以为各个线程提供各自的实例。例如SimpleDateFormat是非线程安全的 假设有一个静态变量 public static final SimpleDateFormat ...
  • daiyutage
  • daiyutage
  • 2017-04-12 22:43:46
  • 1986

Java并发(六):线程本地变量ThreadLocal、再聊线程池

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7451464,转载请注明。ThreadLocal首先说明ThreadLoc...
  • vanpersie_9987
  • vanpersie_9987
  • 2017-03-28 17:32:50
  • 1422
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1413
    排名: 3万+