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