2011-09-28 33 views
1

我想知道下面的类是否健全。我正在使用它为我的测试环境中的每个测试启动一堆模拟器。子过程在自己的线程

 
    class SubProcessInOwnThread(threading.Thread): 
     def __init__(self, arguments, currentWorkingDirectory): 
      self.arguments = arguments 
      self.currentWorkingDirectory = currentWorkingDirectory 
      threading.Thread.__init__(self) 
      self.isTerminated = False 

     def run(self): 
      try: 
       self.subProcess = subprocess.Popen(self.arguments, cwd=self.currentWorkingDirectory) 
       self.subProcess.wait() 
      finally: 
       self.isTerminated = True 

     def kill(self): 
      while not self.isTerminated: 
       try: 
        self.subProcess.kill() 
       except: 
        time.sleep(0.1) 

一些senarios:

 
    # Normal 
    subProcessThreadArguments = ["cmd.exe"] 
    subProcessThread = SubProcessInOwnThread(subProcessThreadArguments,r"C:\\") 
    subProcessThread.start() 
    time.sleep(5) 
    subProcessThread.kill() 

    # Process killed very quickly 
    subProcessThreadArguments = ["cmd.exe"] 
    subProcessThread = SubProcessInOwnThread(subProcessThreadArguments,r"C:\\") 
    subProcessThread.start() 
    subProcessThread.kill() 

    # Incorrect configuration 
    subProcessThreadArguments = ["cmdsfgfg.exe"] 
    subProcessThread = SubProcessInOwnThread(subProcessThreadArguments,r"C:\\") 
    subProcessThread.start() 
    time.sleep(5) 
    subProcessThread.kill() 

所以我可以创建模拟器是这样的:

 
    subProcessThreadArguments1 = ["sim1.exe"] 
    subProcessThread1 = SubProcessInOwnThread(subProcessThreadArguments1,r"C:\\") 
    subProcessThread1.start() 

    subProcessThreadArguments2 = ["sim2.exe"] 
    subProcessThread2 = SubProcessInOwnThread(subProcessThreadArguments2,r"C:\\") 
    subProcessThread2.start() 

    # do test... 

    subProcessThread1.kill() 
    subProcessThread2.kill() 

我很感兴趣的任何improvents。我应该考虑使用with关键字吗?如果是这样,这个好处是什么?

谢谢!

回答

2

我看不到在这里有一个单独的线程卡在wait()这一点。直接在子工作将努力像

class SubProcessWithoutThread(object): 
    def __init__(self, arguments, currentWorkingDirectory): 
     self.arguments = arguments 
     self.currentWorkingDirectory = currentWorkingDirectory 
     self.isTerminated = False 

    def start(self): 
     self.subProcess = subprocess.Popen(self.arguments, cwd=self.currentWorkingDirectory) 

    def kill(self): 
     while self.subProcess.poll() is None: 
      try: 
       self.subProcess.kill() 
      except: 
       time.sleep(0.1) 

    __enter__ = start 
    def __exit__(self, *x): 
     self.kill() 

(未经测试)

我已经添加了一个上下文管理的方法,但我看不出如何能帮助你,因为这将是一个相当一堆with您必须创建的语句,包括必要的缩进。

但也许我已经得到了你的意图错误...

+0

感谢您的帮助!不,我也觉得__with__不会帮助我,但我还在学习,所以我不确定... – Baz

相关问题