에서 전역 변수에 액세스 할 수 없음 값은 변경되지 않고 First
입니다. p는 새로운 과정이 아닌 새로운 스레드 때문에는 아래 코드에서 파이썬
hello
before: First
after: First
에서 전역 변수에 액세스 할 수 없음 값은 변경되지 않고 First
입니다. p는 새로운 과정이 아닌 새로운 스레드 때문에는 아래 코드에서 파이썬
hello
before: First
after: First
당신이보고있는 동작은 다음과 같습니다 여기에 출력됩니다. 새 프로세스를 생성하면 초기 프로세스 상태를 완전히 복사 한 다음 병렬로 실행을 시작합니다. 스레드를 생성 할 때 스레드는 처음 스레드와 메모리를 공유합니다.
프로세스는 메모리 격리가 있으므로 공유 메모리에 읽기 및 쓰기로 인해 경쟁 조건 오류가 발생하지 않습니다. 그러나 하위 프로세스에서 상위 프로세스로 데이터를 가져 오려면 파이프와 같은 프로세스 간 통신 형식을 사용해야하며 메모리를 포크하기 때문에 스폰하기 위해 비용이 많이 듭니다. 항상 컴퓨터 과학에서와 마찬가지로, 당신은 절충안을 만들어야합니다. 자세한 내용은
은 다음을 참조하십시오 당신이 실제로 수행하는 대신 스레드를 사용하는 것을 고려하려는 내용에 따라 https://en.wikipedia.org/wiki/Inter-process_communication
전역 상태가 공유되지 않으므로 하위 프로세스의 변경 사항이 적용되지 않습니다.
실제로는하지만, 단지 양산 프로세스에 대한 전역 변수를 변경 않습니다 여기
이유입니다. 프로세스 내에서 액세스하면 볼 수 있습니다. 프로세스의 전역 변수 환경은 초기화되지만 변경 사항은 프로세스 자체로 제한되며 전체는 이 아닙니다.
당신이 정말로 그것을하는 또 다른 방법은 자신의 과정에서 수정 사용해야하는 경우
from multiprocessing import Process
import os
from time import sleep as delay
test = "First"
def f2():
print ("f2:" + test)
def f():
global test
print ('hello')
print ("before: "+test)
test = "Second"
f2()
if __name__ == '__main__':
p = Process(target=f, args=())
p.start()
p.join()
delay(1)
print("after: "+test)