python 다중 스레드 공유 전역 변수의 우열
우선 함수에서 전역 변수를 수정한 상황을 회상해 봅시다.
하나의 함수에서 전역 변수를 수정할 때 글로벌을 사용하여 설명해야 하는지, 전역 변수의 실행 지향을 수정했는지 확인해야 한다.
실행 지향을 수정하면 전역 변수가 새로운 곳을 가리키게 됩니다. 글로벌을 사용해야 합니다.
가리키는 공간의 데이터만 수정했을 뿐, 글로벌을 사용해야 하는 것은 아닙니다.
우리는 하나의 예를 본다. 이 예에서 하나의 하위 라인이 전역 변수에 대해 +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 다중 스레드 공유 전역 변수에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.