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
						
					
					
						
							708 B
						
					
					
				
			
		
		
	
	
							28 lines
						
					
					
						
							708 B
						
					
					
				| 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)
 | |
| 
 | |
| 
 |