>  기사  >  백엔드 개발  >  Python 연구 노트 - ThreadLocal

Python 연구 노트 - ThreadLocal

高洛峰
高洛峰원래의
2017-02-16 11:03:011321검색

멀티 스레드 프로그램을 작성할 때 종종 두 가지 유형의 변수를 접하게 됩니다.

  • 하나는 여러 스레드에서 공유하는 전역 변수입니다. 동작 변경을 방지하기 위해 앞서 잠금이 필요하다고 언급했습니다.

  • 하나는 지역변수입니다. 하나의 스레드에서만 사용되며 스레드는 서로 영향을 미치지 않습니다.

예를 들어 다음 프로그램의 task() 함수에 정의된 count 변수는 지역 변수입니다. 두 개의 스레드를 생성하더라도 countcount에 정의되어 있으므로 두 스레드의 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 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.