zoukankan      html  css  js  c++  java
  • Python中ThreadLocal的理解与使用

    一、对 ThreadLocal 的理解

      ThreadLocal,有的人叫它线程本地变量,也有的人叫它线程本地存储,其实意思一样。   ThreadLocal 在每一个变量中都会创建一个副本,每个线程都可以访问自己内部的副本变量。

    二、为什么会出现 ThreadLocal 的技术应用

      我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。如果一个线程对全局变量进行了修改,将会影响到其他所有的线程对全局变量的计算操作,从而出现数据混乱,即为脏数据。为了避免逗哥线程同时对变量进行修改,引入了线程同步机制,通过互斥锁、条件变量或者读写锁来控制对全局变量的访问。

      只用全局变量并不能满足多线程环境的需求,很多时候线程还需要拥有自己的私有数据,这些数据对于其他线程来说是不可见的。因此线程中也可以使用局部变量,局部变量只有线程自身可以访问,同一个进程下的其他线程不可访问。

      有时候使用局部变量不太方便,因此 Python 还提供了ThreadLocal 变量,它本身是一个全局变量,但是每个线程却可以利用它来保存属于自己的私有数据,这些私有数据对其他线程也是不可见的。

      ThreadLocal 真正做到了线程之间的数据隔离。

    三、代码如下:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # ThreadLocal code
     4 
     5 import threading
     6 
     7 NUM = 0
     8 local = threading.loacl()
     9 
    10 
    11 def run(x, n):
    12     x = x + n
    13     x = x - n
    14 
    15 
    16 def func(n):
    17     local.x = NUM  # 将全局变量赋值给一个线程要执行的函数的局部变量。
    18     for i in range(1000000):
    19         run(local.x, n)
    20     print('%s-%d' % (threading.current_thread().name, local.x))
    21 
    22 
    23 if __name__ == '__main__':
    24     t1 = threading.Thread(target=func, args=(6,))
    25     t2 = threading.Thread(target=func, args=(9,))
    26     t1.start()
    27     t2.start()
    28     t1.join()
    29     t2.join()
    30     print('NUM = ', NUM)
    view_ThreadLocal_code

      上面的示例中每一个线程都可以通过 local.x 获取自己独有的数据,并且每个线程读取到的loacl.x 都不同,真正做到线程之间的隔离。

    参考文献地址:

    http://python.jobbole.com/86150/

    https://blog.csdn.net/sonny543/article/details/51336457

    愿你多向优秀的人学习; 愿你不怕麻烦,勤做总结; 愿你每天都有意义; 愿你不负年华; 愿你…… 愿你…… 愿你…… 愿你一生都快乐!
  • 相关阅读:
    python核心编程(多线程编程)
    Python核心编程(网络编程)
    将非drf接口配置到swagger
    jmeter设置全局变量--通过正则表达式进行提取
    jmeter实现用户登录高并发
    Django跨关联关系查询
    python树状结构取值和加值
    chrome浏览器代理插件SwitchyOmega使用
    burp suite历程-安装burp suite
    django中对模型字段名的限制
  • 原文地址:https://www.cnblogs.com/linpd/p/10051945.html
Copyright © 2011-2022 走看看