原文地址:http://www.cnblogs.com/fengmk2/archive/2008/06/04/1213958.html

在threading module中,有一个非常特别的类local。一旦在主线程实例化了一个local,它会一直活在主线程中,并且又主线程启动的子线程调用这个local实例时,它的值将会保存在相应的子线程的字典中。

我们先看看测试代码:

#!/usr/bin/python# -*- coding: utf-8 -*-# Description: test the threading.local class# Create: 2008-6-4# Author: MK2[fengmk2@gmail.com]from threading import local, enumerate, Thread, currentThread

local_data = local()local_data.name = 'local_data'

class TestThread(Thread):def run(self):print currentThread()print local_data.__dict__                local_data.name = self.getName()                local_data.add_by_sub_thread = self.getName()print local_data.__dict__

if __name__ == '__main__':print currentThread()print local_data.__dict__

        t1 = TestThread()        t1.start()        t1.join()

        t2 = TestThread()        t2.start()        t2.join()

print currentThread()print local_data.__dict__
运行结果:

<_MainThread(MainThread, started)>
{'name': 'local_data'}
<TestThread(Thread-1, started)>
{}
{'add_by_sub_thread': 'Thread-1', 'name': 'Thread-1'}
<TestThread(Thread-2, started)>
{}
{'add_by_sub_thread': 'Thread-2', 'name': 'Thread-2'}
<_MainThread(MainThread, started)>
{'name': 'local_data'}

主线程中的local_data并没有被改变,而子线程中的local_data各自都不相同。

怎么这么神奇?local_data具有全局访问权,主线程,子线程都能访问它,但是它的值却是各当前线程有关,究竟什么奥秘在这里呢?

查看了一下local的源代码,发现就神奇在_path()方法中:

def _patch(self):    key = object.__getattribute__(self, '_local__key')    d = currentThread().__dict__.get(key)if d is None:        d = {}        currentThread().__dict__[key] = d        object.__setattr__(self, '__dict__', d)

        # we have a new instance dict, so call out __init__ if we have        # one        cls = type(self)if cls.__init__ is not object.__init__:            args, kw = object.__getattribute__(self, '_local__args')            cls.__init__(self, *args, **kw)else:        object.__setattr__(self, '__dict__', d)
 

每次调用local实例的属性前,local都会调用这个方法,找到它保存值的地方.

d = currentThread().__dict__.get(key)  就是这个地方,确定了local_data值的保存位置。所以子线程访问local_data时,并不是获取主线程的local_data的值,在子线程 第一次访问它是,它是一个空白的字典对象,所以local_data.__dict__为 {},就像我们的输出结果一样。

如果想在当前线程保存一个全局值,并且各自线程互不干扰,使用local类吧。

转载于:https://www.cnblogs.com/Donal/archive/2011/03/09/1979222.html

转:Python: threading.local是全局变量但是它的值却在当前调用它的线程当中相关推荐

  1. python threading.local

    mydata = threading.local() mydata.x = 1 type(mydata) <class '_thread._local'> 参考: https://my.o ...

  2. 锁、threading.local、线程池

    一.锁 Lock(1次放1个) 什么时候用到锁: 线程安全,多线程操作时,内部会让所有线程排队处理.如:list.dict.queue 线程不安全, import threading import t ...

  3. python传递utf8 到c++_深入理解Python的TLS机制和Threading.local()

    ? "Python猫" ,一个值得加星标的公众号 花下猫语:分享一篇深度好文,文章有点长,值得收藏细读.作者: Lateautunm4lin 来源:https://zhuanlan ...

  4. python3 多线程 threading.local 代理_threading.local的作用?Python每日3题(多线程专题)...

    这里是Python7编程挑战-多线程专题! 每天学习3个问题,包括初级,中级,高级问题各1个. 今天是第5天!一起来呀,就7天!每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道 ...

  5. python threading.loca讲解

    1.全局变量 多个线程同时对一个全局变量操作,可能会产生脏数据 import threading global_num = 0def thread_cal():global global_numfor ...

  6. Python 中多线程共享全局变量的问题

    Python 中多个线程之间是可以共享全局变量的数据的. 但是,多线程共享全局变量是会出问题的. 假设两个线程 t1 和 t2 都要对全局变量 g_num (默认是0)进行加1运算,t1 和 t2 都 ...

  7. Python学习笔记- Python threading模块

    Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import timede ...

  8. python函数 global_Python global全局变量函数详解

    global语句的作用 在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量.此时用global语句就可以变成这个任 ...

  9. python threading timer 退出_解决Python中定时任务线程无法自动退出的问题

    python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子 ...

最新文章

  1. java adobe pdf转word_原来PDF转Word这么简单!现在才知道
  2. 鸿蒙系统合适上线手机端,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...
  3. 多个ViewPager引发的Fragment未初始化
  4. python降级-关于卸载:如何从Python 3.2降级到2.7?
  5. 推荐系统的发展演进历史和模型的目标及优缺点
  6. C——通过调用函数分配内存
  7. Python 调试方法
  8. 计算机硬件实验教程pdf,计算机硬件技术基础实验教程答案(重庆大学)
  9. Maxthon3资源嗅探器给力 MP3下载地址得来全不费功夫!
  10. 代码检查、走查与评审
  11. 《游戏系统设计三》游戏服务器线上出bug,怎么办?急,在线等!热更新
  12. Ubuntu压缩视频
  13. 同工作组计算机连接用户名和密码错误,登录失败: 未知的用户名或错误密码
  14. linux7 域名解析,CentOS 7之DNS域名解析
  15. 【设计模式】-状态模式->APP抽奖活动(源码与类图解析)
  16. 2021 CCF大数据与计算智能大赛!
  17. 《A Study on Performance Benefifits of Core Morphing in an Asymmetric Multicore Processor》文献精读1
  18. 摩克机器人_第三章 摩克都市的一场灾难(上)
  19. awk内置命令RS,ORS,FS,OFS的使用
  20. 【传感器大赏】压电薄膜震动传感器

热门文章

  1. vue-transition动画
  2. JavaScript --- 表单focus,blur,change事件的实现
  3. 基于 axios 的 Vue 项目 http 请求优化
  4. 修正discuz发帖首次换行无效的问题
  5. Zipkin-1.19.0学习系列1:java范例
  6. 使用 RMAN 同步数据库
  7. Python 18.4 aiohttp
  8. common-collections中Java反序列化漏洞导致的RCE原理分析
  9. BufferedInputStream学习笔记
  10. iOS CoreAnimation