2015-05-27 43 views
2

我希望编写一个执行另一个进程的命令的进程。这包括接收命令,处理它并响应调用进程和结果。在请求执行下一个命令之前,调用进程应等待答复。这是我到目前为止:处理产生的进程中的异常

import multiprocessing 
import time 

class CommandProcessor(multiprocessing.Process): 
    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.command = multiprocessing.Queue() 
     self.result = multiprocessing.Queue() 

    def run(self): 
     while True: 
      c = self.command.get() 
      if not c: break 
      self.result.put(str(c)) 

    def execute(self, n): 
     self.command.put(n) 
     return self.result.get() 

    def stop(self): 
     self.command.put(None) 
     self.join() 

try: 
    p = CommandProcessor() 
    p.start() 
    r = p.execute(1) 
    print("Result: "+r) 
    r = p.execute(2) 
    print("Result: "+r) 
    r = p.execute(3) 
    print("Result: "+r) 
finally: 
    p.stop() 

至少有一个问题,我的设计。例如,如果​​中存在异常,则主进程将无限期地等待return self.result.get()行。我可以给get()方法添加一个超时,但是我运行的一些命令需要相当长的时间来执行。所以超时时间必须足够长才能保证执行。我该如何处理这个问题,以便在出现异常时将两个进程终止,并将有用的堆栈跟踪转储到标准输出。

+0

所以它包装在一个''尝试/ except''做*什么明智的*。 –

回答

0

把它包在一个try/except

例子:除了

def execute(self, n): 
    try: 
     self.command.put(n) 
     return self.result.get() 
    except Exception as e: 
     return e # TODO: Do something sensible here 
+0

这没有帮助,因为这个方法是从主进程调用的,我指的是CommandProcessor进程中的异常。 – Baz

0

这是run()方法,在衍生的进程执行,因此,这就是你需要做你的异常处理。这是一个例子,堆栈跟踪作为结果返回。另外,请注意检测None命令的正确方式(即“停止”信号)。

import traceback 

class CommandProcessor(): 
    ... 

    def run(self): 
     while True: 
      c = self.command.get() 
      if c is None: 
       break 
      try: 
       1/(c-2) # Throws exception if c is 2. 
      except: 
       c = traceback.format_exc() 
      self.result.put(str(c)) 

你得到的是1个3做工精细,而2个ERRS:

Result: 1 
Result: Traceback (most recent call last): 
    File "a.py", line 17, in run 
    1/(c-2) # Throws exception if c is 2. 
ZeroDivisionError: integer division or modulo by zero 

Result: 3