전: Python: threading. local 은 전역 변수 이지 만 값 은 현재 호출 된 스 레 드 에 있 습 니 다.
4142 단어 reading
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'}
메 인 스 레 드 의 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 류 를 사용 하 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Reading and Writing CSV Files in C#A much simpler way to have your application share data is by reading and writing Comma-Separated Values (CSV) files. CSV...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.