python 다중 스레드 공유 전역 변수의 우열

1. 다중 스레드 공유 전역 변수
우선 함수에서 전역 변수를 수정한 상황을 회상해 봅시다.
하나의 함수에서 전역 변수를 수정할 때 글로벌을 사용하여 설명해야 하는지, 전역 변수의 실행 지향을 수정했는지 확인해야 한다.
실행 지향을 수정하면 전역 변수가 새로운 곳을 가리키게 됩니다. 글로벌을 사용해야 합니다.
가리키는 공간의 데이터만 수정했을 뿐, 글로벌을 사용해야 하는 것은 아닙니다.
우리는 하나의 예를 본다. 이 예에서 하나의 하위 라인이 전역 변수에 대해 +1 조작을 하고, 다른 하위 라인은 전역 변수만 출력하여 데이터가 공유되는지 확인한다.

from threading import Thread
import time

g_num = 100

def work1():
  global g_num
  g_num += 1
  print("----in work1, g_num is %d---" % g_num)

def work2():
  print("----in work2, g_num is %d---" % g_num)

def main():
  print("--- g_num is %d---" % g_num)

  t1 = Thread(target=work1)
  t1.start()

  #  , t1 
  time.sleep(1)

  t2 = Thread(target=work2)
  t2.start()

  time.sleep(1)
  print("--- g_num is %d---" % g_num)

if __name__ == "__main__":
  main()
하위 스레드 2가 100으로 인쇄되면 전체 변수가 공유되지 않습니다.
만약 하위 스레드 2가 출력한 데이터가 101이라면 전역 변수가 공유된다는 것을 설명한다.
실행 결과:
--- 스레드가 생성되기 전 g_num is 100---
----in work1, g_num is 101---
----in work2, g_num is 101---
--- 스레드 생성 후 g_num is 101---
위의 예는 다중 스레드가 전역 변수를 공유하는 것을 설명한다.
2. 목록은 실참으로서 라인에 전달한다
위에서 우리는 다중 스레드 간에 전역 변수를 공유하는 것을 검증했다.
우리도 변수를 실참으로 삼아 라인에 전달함으로써 다중 라인에서 데이터를 공유하는 것을 검증할 수 있다.

from threading import Thread
import time

def work1(nums):
  nums.append(44)
  print("----in work1---", nums)

def work2(nums):

  print("----in work2---", nums)


g_nums = [11, 22, 33]

t1 = Thread(target=work1, args=(g_nums,))
t1.start()
#  , t1 
time.sleep(1)
t2 = Thread(target=work2, args=(g_nums,))
t2.start()
실행 결과:
----in work1--- [11, 22, 33, 44]
----in work2--- [11, 22, 33, 44]
그런데 왜 여러 스레드 간에 전역 변수를 공유해야 합니까?
다중 임무는 왕왕 협조적으로 사용하기 때문이다.
하나의 프로세스 내의 모든 라인에서 전역 변수를 공유하면 여러 라인 사이에서 데이터를 공유하는 데 매우 편리하다.
단점은 스레드가 전역 변수에 대한 임의의 수정으로 인해 다중 스레드 간에 전역 변수에 대한 혼란을 초래할 수 있다는 것이다. 즉, 스레드가 안전하지 않다는 것이다.
이상은python 다중 스레드 공유 전역 변수의 우열에 대한 상세한 내용입니다. 더 많은python 다중 스레드 공유 전역 변수에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기