2016-12-29 67 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

相关问题