멀티 스레드 프로그램을 작성할 때 종종 두 가지 유형의 변수를 접하게 됩니다.
하나는 여러 스레드에서 공유하는 전역 변수입니다. 동작 변경을 방지하기 위해 앞서 잠금이 필요하다고 언급했습니다.
하나는 지역변수입니다. 하나의 스레드에서만 사용되며 스레드는 서로 영향을 미치지 않습니다.
예를 들어 다음 프로그램의 task()
함수에 정의된 count
변수는 지역 변수입니다. 두 개의 스레드를 생성하더라도 count
가 count
에 정의되어 있으므로 두 스레드의 task
증분은 서로 영향을 미치지 않습니다.
그래서 이것이 완벽한 솔루션인가요? 아직 아님.
위의 예는 매우 간단하지만 여러 지역 변수, 여러 함수 호출 등과 같은 더 복잡한 비즈니스 논리를 접할 때 이러한 방식으로 지역 변수를 정의하는 것은 간결하지 않게 됩니다.
여러 함수 호출은 다음을 참조합니다.
함수 methodA()를 정의했습니다. 이 메서드 본문은 methodB()를 호출하고, methodB() 메서드 본문은 methodC()를 호출합니다...
만약 우리가 스레드에서 methodA()를 호출하고 변수 attr을 사용한 다음 attr을 계층별로 후속 함수에 전달해야 합니다.
스레드에서 변수를 정의하고 스레드의 모든 함수를 호출할 수 있는 방법이 있습니까? 간단하고 명확합니까?
Python이 이를 대신해 줍니다. 바로 ThreadLocal입니다.
ThreadLocal 사용에는 세 단계만 필요합니다:
threading.local 객체 정의
스레드 내의 개체에 매개변수를 바인딩합니다. 모든 바인딩된 매개변수는 스레드 격리되어 있습니다.
은 스레드 내에서 호출됩니다.
코드는 아래와 같습니다.
import threading def task(): count = 0 for i in range(1000): count += 1 print count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
더 많은 Python 학습 노트 - ThreadLocal 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!