파이썬(Python)/문법

[Python] 멀티스레딩과 Global 변수 공유 방법(Multi threading, thread)

끄적끄적아무거나 2022. 7. 1. 18:14
반응형

 

목차

     

     

     

     

    앞서 멀티스레드(Multi Thread)의 정의와 기본적인 사용방법에 대해 알아보았습니다(https://scribblinganything.tistory.com/568).

     

    이번 시간에는 실제 여러개의 멀티 스레딩이 동작할 때 서로간에 변수(variable)를 공유하거나 주고 받아야 하는 일들이 있습니다. 이때 변수를 각 각의 스레드가 어떻게 이용하는지에 대해 알아보겠습니다.

     

    예를 들어 pyserial과 같은 통신 모듈을 사용할 경우 통신 모듈은 별도의 thread에서 동작 시키고 모듈에서 나오는 값들을 다른 thread에서 값을 이용하고 싶은 일들이 발생합니다. 이럴때 사용하는 것이 변수 공유 방법입니다.

     

     

    파이썬 멀티스레딩(Multi threading) Global 변수

     

    앞서 멀티 프로세스(Process)와 멀티 스레딩(Threading)의 차이를 얘기할 때 스레딩은 한 프로세스에서 메모리를 공유 한다고 하였습니다(https://scribblinganything.tistory.com/566).  

     

    이러한 특성을 이용해서 함수 외부에 global 변수를 선언하고 공유해서 사용해보겠습니다.

     

    이때 중요한 부분이 전역(global) 변수의 선언 위치 입니다. 아래 예제를 통해 쉽게 알아보겠습니다. 

     

     

    예제 코드>>

    import threading
      
    n = 0
      
    def add():
        global n
        n += 1
      
    def func0():
        for _ in range(100):
            add()
    
    def func1():
        for _ in range(10):
            add()
      
    def main_func():
        global n
        n = 0
      
        t1 = threading.Thread(target=func0)
        t2 = threading.Thread(target=func1)
      
        t1.start()
        t2.start()
      
        t1.join()
        t2.join()
      
    if __name__ == "__main__":
        for i in range(5):
            main_func()
            print("Total n : ", n)

    3번 라인: n이라는 전역(Global)변수를 선언합니다. 함수들 밖에 위치합니다.

    6번 라인: 전역변수 n을 사용하기 위해 global로 전역 변수 표기를 합니다.

    18~19번 라인: 전역 변수 n 을 사용한 함수가 thread로 들어 가므로 전체 함수에서도 선언하여야합니다.

     

    결과>>

    Total n :  110
    Total n :  110
    Total n :  110
    Total n :  110
    Total n :  110

     

    각 스레드에서 합한 값이 전역 변수 n에 더해진것을 알 수 있습니다. 

     

     

    만일 main_func 함수내에 global 선언을 없앨 경우 19번째 줄의 n=0이 전역으로 인식이 되지 않아 아래와 같이 계속된 합산 값이 들어가게 됩니다.

     

    Total n :  110
    Total n :  220
    Total n :  330
    Total n :  440
    Total n :  550

     

    반응형