You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					28 lines
				
				707 B
			
		
		
			
		
	
	
					28 lines
				
				707 B
			| 
											6 years ago
										 | import signal
 | ||
|  | 
 | ||
|  | class TimeoutException(Exception):
 | ||
|  |   pass
 | ||
|  | 
 | ||
|  | class Timeout:
 | ||
|  |   """
 | ||
|  |   Timeout context manager.
 | ||
|  |   For example this code will raise a TimeoutException:
 | ||
|  |   with Timeout(seconds=5, error_msg="Sleep was too long"):
 | ||
|  |     time.sleep(10)
 | ||
|  |   """
 | ||
|  |   def __init__(self, seconds, error_msg=None):
 | ||
|  |     if error_msg is None:
 | ||
|  |       error_msg = 'Timed out after {} seconds'.format(seconds)
 | ||
|  |     self.seconds = seconds
 | ||
|  |     self.error_msg = error_msg
 | ||
|  | 
 | ||
|  |   def handle_timeout(self, signume, frame):
 | ||
|  |     raise TimeoutException(self.error_msg)
 | ||
|  | 
 | ||
|  |   def __enter__(self):
 | ||
|  |     signal.signal(signal.SIGALRM, self.handle_timeout)
 | ||
|  |     signal.alarm(self.seconds)
 | ||
|  | 
 | ||
|  |   def __exit__(self, exc_type, exc_val, exc_tb):
 | ||
|  |     signal.alarm(0)
 |