轉:Python: threading.local是全局變量但是它的值卻在當前調用它的線程當中

原文地址: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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275617.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab的邊緣檢測方法,常用圖像邊緣檢測方法及Matlab研究

2011 年 2 月 15 日第 34 卷第 4 期 現代電子技術 Modern Electronics Technique Feb. 2011 Vol. 34 No. 4 常用圖像邊緣檢測方法及 Matlab 研究 韋  煒 (西安文理學院 , 陜西 西安   710065) 摘  要 :邊緣檢測在數字圖像處理中有著重要的作用。為了在實際應用中能夠選擇最佳…

單選按鈕步驟流程向導 js_創建令人愉快的按鈕的6個步驟

單選按鈕步驟流程向導 jsThere is no modern interactive UI without buttons. They are an fundamental part of every digital solution. Learn how to improve the style of your buttons and delight users with perfect style.沒有按鈕&#xff0c;就沒有現代的交互式UI。…

Android 四大組件之 Activity

什么是 Activity&#xff1f; Activity 是 Android 的四大組件之一&#xff0c;是用戶操作的可視化界面&#xff0c;它為用戶提供了一個完成操作指令的窗口。 當我們創建完 Activity 之后&#xff0c;需要調用 setContentView(view) 方法來完成界面的顯示&#xff0c;以此來為用…

axios怎么封裝,才能提升效率?

大家好&#xff0c;我是若川。今天分享一篇axios封裝的文章。學習源碼系列、面試、年度總結、JS基礎系列。作為前端開發者&#xff0c;每個項目基本都需要和后臺交互&#xff0c;目前比較流行的ajax庫就是axios了&#xff0c;當然也有同學選擇request插件&#xff0c;這個蘿卜白…

圖片有花

http://www.56.com/u50/v_NTUwMzE1NDM.html http://www.56.com/u39/v_NTUwMzE2MjA.html http://www.cnblogs.com/coffee_cn/archive/2009/11/30/1613823.html http://www.imagemagick.org/script/binary-releases.php?ImageMagickmm3e9bn5mtos6eiaelh9d4aoe4#windows 轉載于:h…

java 代碼執行el,專屬于java的漏洞——EL表達式注入

前言“FSRC經驗分享”系列文章&#xff0c;旨在分享焦點科技信息安全部工作過程中的經驗總結&#xff0c;包括但不限于漏洞分析、運營技巧、sdl推行、等保合規、自研工具等等。歡迎各位安全從業者持續關注~0x01EL簡介表達式語言(Expression Language 以下簡稱EL)是以JSTL(JavaS…

護膚產生共鳴_通過以人為本的設計編織共鳴的20個指針

護膚產生共鳴Deep into a project right now, I can’t help but reflect on how I practice empathy in design. Human centered design means empathising with and designing for people, keeping our focus on people throughout. It is not just one stage, it is a minds…

谷歌已推送 Android Q Beta 1

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; >>> 今日凌晨&#xff0c;谷歌正式推送了 Android Q 的首個 Beta 版本&#xff0c;Pixel 全系列手機可以嘗鮮體驗這款最新的系統。 據官方博客介紹&#xff0c;Android Q 為用戶帶來了…

對使用CodeSmith模板生成NHibernate的代碼的分析

CodeSmith是我們常用的代碼生成工具&#xff0c;其跟據不同的模板生成不同代碼的方式能大大加快我們的項目開發&#xff0c;減少重復勞動。NHibernate模板就是其常用模板之一。從這里可以下載到最新的模板文件。現在最新的版本為NHibernate-v1.2.1.2125&#xff0c;可以生成NHi…

若川誠邀你加源碼共讀群,每周一起學源碼

小提醒&#xff1a;若川視野公眾號面試、源碼等文章合集在菜單欄中間【源碼精選】按鈕&#xff0c;歡迎點擊閱讀&#xff0c;也可以星標我的公眾號&#xff0c;便于查找。回復pdf&#xff0c;可以獲取前端優質書籍。最近我創建了一個源碼共讀的前端交流群&#xff0c;希望嘗試幫…

matlab 規范,matlab-代碼-規范

matlab-代碼-規范 1. 標識符命名原則 標識符的名字應當直觀&#xff0c;其長度應當符合“最小長度&#xff0c;最大信息量”原則。 1) 非矩陣變量&#xff1a; 變量名應該以小寫字母開頭的大小寫混合形式 譬如&#xff1a;shadowFadingTable&#xff0c;servingSector&#xf…

zoom視頻會議官網_人性化視頻會議的空間(Zoom等)

zoom視頻會議官網第二部分&#xff1a;房間的創造力 (Part Two: The Creativity of Rooms) In Part One I shared thoughts on how virtual spaces can often leave little room to embody our most human selves. The lack of a public sphere that parallels our shared publ…

KOFLive Postmortem

為期兩個月的團隊項目完成了&#xff0c;我們的游戲也已經發布。在這個名叫KOFLive的小游戲里&#xff0c;我們集成了五個真人角色&#xff0c;每個角色有拳腳基本招數以及三個小招、一個大招&#xff0c;硬值、防御、集氣、雙人對戰、人機對戰、練習模式等格斗游戲的Feature基…

單調隊列優化多重背包

就是按照 % 體積的余數來分組&#xff0c;每組單調隊列優化。 直接上模板好了。 1 #include <bits/stdc.h>2 3 typedef long long LL;4 const int N 100010;5 6 int n, V, cnt[N], cost[N];7 LL f[2][N], val[N], p[N], top, head;8 9 inline void Max(LL &a, const…

2021年7月 蝦皮、貨拉拉、有贊等面經總結

大家好&#xff0c;我是若川&#xff0c;加我微信 ruochuan12 進源碼交流群。今天分享一篇7月份新鮮出爐的面經&#xff0c;文章較長&#xff0c;可以收藏再看。學習源碼系列、面試、年度總結、JS基礎系列。本文來自作者幾米陽光 投稿 原文鏈接&#xff1a;https://juejin.cn/p…

Oracle對表名大小寫敏感嗎,讓Oracle 大小寫敏感 表名 字段名 對像名

一、解決方案1、在表名、字段名、對象名上加上雙引號&#xff0c;即可實現讓oracle大小寫區分。2、但是這又引起了另一個問題&#xff1a;在數據庫操作中&#xff0c;sql語句中相應的表名、字段名、對象名上一定要加雙引號。解決辦法是&#xff1a;使用"\"轉義。如&a…

谷歌抽屜_Google(最終)會殺死導航抽屜嗎?

谷歌抽屜A couple of months ago Google has celebrated with enthusiasm 15 years of Google Maps, one of the most used and appreciated services worldwide from the company.幾個月前&#xff0c;Google熱情地慶祝Google Maps誕生15周年&#xff0c;這是該公司在全球范圍…

MySQL——安裝

MySQL——安裝 1. 下載源&#xff1a; http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql80-community-release-el7-2.noarch.rpm 該源目前為8.0版本&#xff0c;如果需要最新請退至根目錄找。 1wget http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_…

寫給初中級前端的高級進階指南等

大家好&#xff0c;我是若川。話不多說&#xff0c;這一次花了幾小時精心為大家挑選了20余篇好文&#xff0c;供大家閱讀學習。本文閱讀技巧&#xff0c;先粗看標題&#xff0c;感興趣可以都關注一波&#xff0c;絕對不虧。程序員成長指北考拉妹子&#xff0c;一個有趣的且樂于…

oracle for函數,oracle分區表述的FOR語句(一)

指定一個分區除了使用分區名稱外&#xff0c;很多時候還可以使用FOR語句。從11g開始&#xff0c;對分區進行操作的時候&#xff0c;不僅可以使用分區名稱&#xff0c;還可以使用FOR語句。在10g中&#xff0c;MERGE RANGE分區的語句如下&#xff1a;SQL> SELECT * FROM V$VER…