2011-07-01 22 views

cevap

11

Basit, hızlı kesiciler dışında SIGALRM'den kaçının. Çok eski, sınırlı bir mekanizma, daha karmaşık olan herhangi bir şeye uygun değil: sadece tek bir alarm kurabilirsiniz ve herhangi bir sistem çağrısını, kesintiye uğramayı düşündüğünüzden ziyade o anda keser.

import subprocess, signal, os, threading, errno 
from contextlib import contextmanager 

class TimeoutThread(object): 
    def __init__(self, seconds): 
     self.seconds = seconds 
     self.cond = threading.Condition() 
     self.cancelled = False 
     self.thread = threading.Thread(target=self._wait) 

    def run(self): 
     """Begin the timeout.""" 
     self.thread.start() 

    def _wait(self): 
     with self.cond: 
      self.cond.wait(self.seconds) 

      if not self.cancelled: 
       self.timed_out() 

    def cancel(self): 
     """Cancel the timeout, if it hasn't yet occured.""" 
     with self.cond: 
      self.cancelled = True 
      self.cond.notify() 
     self.thread.join() 

    def timed_out(self): 
     """The timeout has expired.""" 
     raise NotImplementedError 

class KillProcessThread(TimeoutThread): 
    def __init__(self, seconds, pid): 
     super(KillProcessThread, self).__init__(seconds) 
     self.pid = pid 

    def timed_out(self): 
     try: 
      os.kill(self.pid, signal.SIGKILL) 
     except OSError as e: 
      # If the process is already gone, ignore the error. 
      if e.errno not in (errno.EPERM, errno. ESRCH): 
       raise e 

@contextmanager 
def processTimeout(seconds, pid): 
    timeout = KillProcessThread(seconds, pid) 
    timeout.run() 
    try: 
     yield 
    finally: 
     timeout.cancel() 


def example(): 
    proc = subprocess.Popen(["sleep", "5"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

    with processTimeout(1, proc.pid): 
     print proc.communicate() 

    resultcode = proc.wait() 
    if resultcode < 0: 
     print "error: %i" % resultcode 

if __name__ == '__main__': 
    example() 

dışarı zamanlama şeye bağlı

zamanlamayı izin vermek SIGKILL daha hafif bir sinyal kullanmak isteyebilirsiniz:

Bu örneğin süreci öldürmek için bir zaman aşımı iş parçacığı kullanımı daha temiz Kendinden sonra temizlemek için bir süreç.

İlgili konular