0

잠시 후에 일부 프로세스를 종료해야하므로 기다리는 동안 다른 프로세스를 잠자 게했습니다. 그러나 새로운 프로세스는 내가 추측하는 주요 프로세스에서 전역 변수에 액세스 할 수 없습니다. 어떻게 해결할 수 있니?파이썬 - 글로벌 변수를 멀티 프로세싱에 전달하는 방법. 프로세스?

코드 :

import os 
from subprocess import Popen, PIPE 
import time 
import multiprocessing 


log_file = open('stdout.log', 'a') 
log_file.flush() 

err_file = open('stderr.log', 'a') 
err_file.flush() 

processes = [] 


def processing(): 
    print "processing" 
    global processes 
    global log_file 
    global err_file 

    for i in range(0, 5): 
     p = Popen(['java', '-jar', 'C:\\Users\\two\\Documents\\test.jar'], stdout=log_file, stderr=err_file) # something long running 
     processes.append(p) 
    print len(processes) # returns 5 

def waiting_service(): 
    name = multiprocessing.current_process().name 
    print name, 'Starting' 
    global processes 
    print len(processes) # returns 0 

    time.sleep(2) 

    for i in range(0, 5): 
     processes[i].terminate() 
    print name, 'Exiting' 

if __name__ == '__main__': 
    processing() 

    service = multiprocessing.Process(name='waiting_service', target=waiting_service) 

    service.start() 
+1

귀하의 코드는 내가 말할 수있는 한 원하는대로 수행한다고 생각합니다. 난 분명히 당신이 하위 프로세스로 실행하려고하는 항아리로 그것을 테스트하지 않은,하지만 내가 테스트 해왔 던 사소한 서브 프로세스가 성공적으로 종료 된 것 같습니다. – rchang

+0

그러면 wait_service()에서 인쇄 된 len (프로세스)가 어떻게 0을 인쇄합니까? 이 5 개의 프로세스를 처리 할 때 5를 반환해야합니다. –

+1

테스트했을 때 두 경우 모두 print 문이 5로 나타났습니다. 어떤 방식 으로든 버전이 일치하지 않았습니까? Linux 커널 3.13.0 (민트 배포판)의 Python 2.7.6을 사용하여 테스트했습니다. – rchang

답변

0

전체 문제는 Windows '파이썬했다. Windows 용 Python은 함수에서 볼 수있는 전역 변수를 차단합니다. 나는 리눅스로 바꿨고 스크립트는 정상적으로 작동한다. 자신의 의견에 대한 @rchang

특별 감사 :

나는 두 경우 모두 인쇄 문은 우리가 어떤 식 으로든 버전 불일치가 아마도 5. 함께했다, 그것을 시험 할 때? Linux 커널 3.13.0 (민트 배포판)의 Python 2.7.6을 사용하여 테스트했습니다.

2

당신은 synchronization primitives를 사용한다.

메인 (부모) 프로세스에 의해 잠시 후 트리거되는 Event을 설정하려고 할 수도 있습니다.

프로세스가 실제로 완료 될 때까지 기다릴 수도 있고 스레드가 될 때까지 join 기다릴 수도 있습니다.

비슷한 작업이 많은 경우 multiprocessing.Pool과 같은 처리 풀을 사용할 수 있습니다.

다음은 어떻게하는지의 작은 예입니다

import multiprocessing 
import time 

kill_event = multiprocessing.Event() 

def work(_id): 
    while not kill_event.is_set(): 
     print "%d is doing stuff" % _id 
     time.sleep(1) 
    print "%d quit" % _id 

def spawn_processes(): 
    processes = [] 

    # spawn 10 processes 
    for i in xrange(10): 
     # spawn process 
     process = multiprocessing.Process(target=work, args=(i,)) 
     processes.append(process) 
     process.start() 
     time.sleep(1) 

    # kill all processes by setting the kill event 
    kill_event.set() 

    # wait for all processes to complete 
    for process in processes: 
     process.join() 

    print "done!" 
spawn_processes() 
관련 문제