2016-12-27 4 views
0
내가 파이썬에서 멀티 프로세싱 라이브러리를 사용하고

에서 전역 변수에 액세스 할 수 없음 값은 변경되지 않고 First입니다. p는 새로운 과정이 아닌 새로운 스레드 때문에는 아래 코드에서 파이썬

hello 
before: First 
after: First 

답변

1

당신이보고있는 동작은 다음과 같습니다 여기에 출력됩니다. 새 프로세스를 생성하면 초기 프로세스 상태를 완전히 복사 한 다음 병렬로 실행을 시작합니다. 스레드를 생성 할 때 스레드는 처음 스레드와 메모리를 공유합니다.

프로세스는 메모리 격리가 있으므로 공유 메모리에 읽기 및 쓰기로 인해 경쟁 조건 오류가 발생하지 않습니다. 그러나 하위 프로세스에서 상위 프로세스로 데이터를 가져 오려면 파이프와 같은 프로세스 간 통신 형식을 사용해야하며 메모리를 포크하기 때문에 스폰하기 위해 비용이 많이 듭니다. 항상 컴퓨터 과학에서와 마찬가지로, 당신은 절충안을 만들어야합니다. 자세한 내용은

은 다음을 참조하십시오 당신이 실제로 수행하는 대신 스레드를 사용하는 것을 고려하려는 내용에 따라 https://en.wikipedia.org/wiki/Inter-process_communication

0

전역 상태가 공유되지 않으므로 하위 프로세스의 변경 사항이 적용되지 않습니다.

실제로는하지만, 단지 양산 프로세스에 대한 전역 변수를 변경 않습니다 여기

이유입니다. 프로세스 내에서 액세스하면 볼 수 있습니다. 프로세스의 전역 변수 환경은 초기화되지만 변경 사항은 프로세스 자체로 제한되며 전체는 이 아닙니다.

당신이 정말로 그것을하는 또 다른 방법은 자신의 과정에서 수정 사용해야하는 경우

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) 

일어나고 무슨 그것은 설명이, 이것은 당신을 도움이 될 doc 또는 post 읽어보십시오.