2016-12-29 66 views
-1

有人可以幫我找出爲什麼下面的代碼將無法正常運行?我想要像以前那樣產生新的進程,但是運行這些代碼會自動運行所有的東西,也就是說所有的工作報告都完成了,當他們沒有時停止,他們的窗口也打開了。任何想法,爲什麼is_alive()返回false時,它實際上是真的?我如何使用多處理(python)模塊錯誤?

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

我還沒有看完所有的問題,但你看過多處理模塊嗎? –

+1

這真的好像是一個更適合http://softwareengineering.stackexchange.com/或http://codereview.stackexchange.com/的問題。你可能會發現那裏的人更願意幫助解決像這樣複雜的事情。堆棧溢出實際上只是爲了獲得有關特定代碼問題的幫助。 –

+0

代碼審查僅適用於有*代碼*(以及滿足幫助中心內的其他條件)。對於SO而言,這太寬泛了,但它不適合CR。 –

回答

0

您的代碼產卵每個createInstance()呼叫2點的過程,我認爲這搞亂了is_alive()電話。

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

這將產生1個進程運行processCreator(cmd)。然後,subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE)會產生一個子進程來運行該命令。這個子進程將立即返回,所以父進程。

我認爲這個版本會起作用,刪除multiprocess的用法。我也改變了cmd的定義(see docs):

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

另外,您可能在完成工作時遇到問題。所有的工作必須在1秒內結束才能退出while部分,否則,你會有一個很好的無限循環。 – charli

相關問題