2011-09-28 7 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

관련 문제