전: Python: threading. local 은 전역 변수 이지 만 값 은 현재 호출 된 스 레 드 에 있 습 니 다.

4142 단어 reading
원본 주소: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[[email protected]]
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'}{}{'add_by_sub_thread': 'Thread-1', 'name': 'Thread-1'}{}{'add_by_sub_thread': 'Thread-2', 'name': 'Thread-2'}<_MainThread(MainThread, started)>{'name': 'local_data'}
 
메 인 스 레 드 의 localdata 는 변 하지 않 았 습 니 다. 하위 스 레 드 의 localdata 는 각각 다르다.
왜 이렇게 신기해?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 값 의 저장 위치.그래서 하위 스 레 드 방문 localdata 시 메 인 스 레 드 를 가 져 오 는 local 이 아 닙 니 다.data 의 값, 하위 스 레 드 에서 처음 방문 한 것 은 빈 사전 대상 이기 때문에 localdata.__dict__{}, 우리 의 출력 결과 와 같 습 니 다.
현재 스 레 드 에 전체 값 을 저장 하고 각 스 레 드 가 서로 간섭 하지 않 으 려 면 local 류 를 사용 하 십시오.

좋은 웹페이지 즐겨찾기