2011-11-11 20 views
1

我碰到一個問題就來了多處理:如何終止正在運行的子進程,而另一個子完成時(多)

class PythonHelper(object): 
    @staticmethod 
    def run_in_parallel(*functions): 
     processes=list() 
     for function in functions: 
      process=Process(target=function) 
      process.start() 
      processes.append(process) 
     for process in processes: 
      process.join() 

以上stathic方法由我來同時運行多個功能(在一個將它們組合處理)。一切都很好,直到我遇到需要強制進程終止而'子進程'終止時。

例如:

from PythonHelper import PythonHelper as ph 
from Recorder import Recorder 

class Logger(object): 

    def run_recorder_proc(self): 
     rec=Recorder() 
     rec.record_video() 

    def run_printer_proc(self): 
    #hypothetical function: execution takes a long time 
     for i in range(9000000): 
      print("number: {}".format(i)) 

    def run_logger(self): 
     ph.run_in_parallel(self.run_printer_proc,self.run_recorder_proc) 

self.run_printer_procself.run_recorder_proc是我的子進程。如何在其中一個完成時「殺死」剩餘的子進程?


編輯: 完整的源代碼:

class PythonHelper(object): 
    @staticmethod 
    #with your fix 
    def run_in_parallel(*functions): 
     processes={} 
     for function in functions: 
      process=Process(target=function) 
      process.start() 
      processes[process.pid]=process 
     # wait for any process to complete 
     pid, status = os.waitpid(-1, 0) 
     # one process terminated 
     # join it 
     processes[pid].join() 
     del processes[pid] 
     # terminate the rest 
     for process in processes.values(): 
      process.terminate() 
     for process in processes.values(): 
      process.join() 


class Logger(object): 
    def run_numbers_1(self): 
     for i in range(900000): 
      print("number: {}".format(i)) 
    def run_numbers_2(self): 
     for i in range(100000): 
      print("number: {}".format(i)) 
    def run_logger(self): 
     ph.run_in_parallel(self.run_numbers_1,self.run_numbers_2) 

if __name__=="__main__": 
    logger=Logger() 
    logger.run_logger() 

基於上面的例子,我想強制run_numbers_1run_numbers_2完成端接。

回答

2

你可以做到這一點通過改變run_in_parallel()咯:

def run_in_parallel(*functions): 
    processes={} 
    for function in functions: 
     process=Process(target=function) 
     process.start() 
     processes[process.pid]=process 
    # wait for any process to complete 
    pid, status = os.waitpid(-1, 0) 
    # one process terminated 
    # join it 
    processes[pid].join() 
    del processes[pid] 
    # terminate the rest 
    for process in processes.itervalues(): 
     process.terminate() 
    for process in processes.itervalues(): 
     process.join() 

[更新] 基於這裏你完整的代碼是一個工作的例子。取而代之的種族傾向os.waitpid()它使用Event對象,其他工序完成時設置:

from multiprocessing import Process, Event 

class MyProcess(Process): 
    def __init__(self, event, *args, **kwargs): 
     self.event = event 
     Process.__init__(self, *args, **kwargs) 

    def run(self): 
     Process.run(self) 
     self.event.set() 

class PythonHelper(object): 
    @staticmethod 
    #with your fix 
    def run_in_parallel(*functions): 
     event = Event() 
     processes=[] 
     for function in functions: 
      process=MyProcess(event, target=function) 
      process.start() 
      processes.append(process) 
     # wait for any process to complete 
     event.wait() 
     # one process completed 
     # terminate all child processes 
     for process in processes: 
      process.terminate() 
     for process in processes: 
      process.join() 


class Logger(object): 
    def run_numbers_1(self): 
     for i in range(90000): 
      print("1 number: {}".format(i)) 
    def run_numbers_2(self): 
     for i in range(10000): 
      print("2 number: {}".format(i)) 
    def run_logger(self): 
     PythonHelper.run_in_parallel(self.run_numbers_1,self.run_numbers_2) 

if __name__=="__main__": 
    logger=Logger() 
    logger.run_logger() 
+1

不幸的是,這種解決方案並不想工作。什麼是pid的初始值?什麼是狀態?它沒有被使用 –

+1

經過小小的更正:[Errno 10]沒有子進程 –

+1

它是'process.pid'。 –

相關問題