2016-12-29 2 views
-1

누군가 다음 코드가 제대로 실행되지 않는 이유를 알아낼 수 있습니까? 이전 프로세스가 완료 될 때 새 프로세스를 생성하려고하지만이 코드를 실행하면 모든 작업이 자동으로 실행됩니다. 즉, 모든 작업 보고서는 완료되지 않았을 때 완료되고 중지되며 창은 열립니다. 왜 실제로 is_alive()에 대한 생각은 false를 반환합니까? 귀하의 코드는 각 createInstance() 전화에이 개 프로세스를 산란한다어떻게 다중 처리 (파이썬) 모듈을 잘못 사용합니까?

import subprocess 
import sys 
import multiprocessing 
import time 

start_on = 33 #'!' 
end_on = 34 
num_processors = 4; 
jobs = [] 

def createInstance(): 
    global start_on, end_on, jobs 
    cmd = "python scrape.py" + " " + str(start_on) + " " + str(end_on) 
    print cmd 
    p = multiprocessing.Process(target=processCreator(cmd)) 
    jobs.append(p) 
    p.start() 
    start_on += 1 
    end_on += 1 
    print "length of jobs is: " + str(len(jobs)) 

def processCreator(cmd): 
    subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE) 

if __name__ == '__main__': 
    num_processors = input("How many instances to run simultaneously?: ") 
    for i in range(num_processors): 
     createInstance() 

    while len(jobs) > 0: 
     jobs = [job for job in jobs if job.is_alive()] 
     for i in range(num_processors - len(jobs)): 
      createInstance() 
     time.sleep(1) 

    print('*** All jobs finished ***') 
+0

나는 모든 질문을 읽을하지 않은하지만 당신은 멀티 모듈 살펴 보았다 : 나는 또한 cmd 정의 (see docs를) 변경? –

+1

이것은 정말로 http://softwareengineering.stackexchange.com/ 또는 http://codereview.stackexchange.com/에 더 적합한 질문 인 것 같습니다. 당신은 거기에있는 사람들이 이처럼 복잡한 것을 다루는데 더 기꺼이 도움이 될 것입니다. 스택 오버플로는 특정 코드 문제에 대한 도움을 얻는 데에만 사용됩니다. –

+0

코드 검토는 * 코드 * (및 기타 도움말 센터 조건이 충족 된 경우)에만 적합합니다. 이것은 너무 넓어서 묻지 만 CR에는 적합하지 않습니다. –

답변

0

, 나는 그게 is_alive() 전화를 장난 같아요.

p = multiprocessing.Process(target=processCreator(cmd)) 

processCreator(cmd)을 실행하는 프로세스가 하나 생성됩니다. 그런 다음 subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE)은 하위 프로세스를 생성하여 명령을 실행합니다. 이 하위 프로세스는 즉시 반환하므로 상위 프로세스가 반환됩니다.

나는이 버전이 작동하여 multiprocess의 사용을 제거한다고 생각합니다.

import subprocess 
import sys 
import time 

start_on = 33 #'!' 
end_on = 34 
num_processors = 4; 
jobs = [] 

def createInstance(): 
    global start_on, end_on, jobs 
    cmd = ["python","scrape.py", str(start_on), str(end_on)] 
    print(str(cmd)) 
    p = subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE) 
    jobs.append(p) 
    p.start() 
    start_on += 1 
    end_on += 1 
    print "length of jobs is: " + str(len(jobs)) 

if __name__ == '__main__': 
    num_processors = input("How many instances to run simultaneously?: ") 
    for i in range(num_processors): 
     createInstance() 

    while len(jobs) > 0: 
     jobs = [job for job in jobs if job.poll() is None] 
     for i in range(num_processors - len(jobs)): 
      createInstance() 
     time.sleep(1) 

    print('*** All jobs finished ***') 
+0

또한 작업을 완료하는 데 문제가있을 수 있습니다. while 섹션을 종료하려면 모든 작업이 1 초 이내에 끝나야합니다. 그렇지 않은 경우 좋은 무한 루프가 발생합니다. – charli

관련 문제