|  | @@ -34,16 +34,23 @@ number_of_searches = 0
 | 
	
		
			
			| 34 | 34 |  
 | 
	
		
			
			| 35 | 35 |  
 | 
	
		
			
			| 36 | 36 |  def search_request_wrapper(fn, url, engine_name, **kwargs):
 | 
	
		
			
			|  | 37 | +    ret = None
 | 
	
		
			
			|  | 38 | +    engine = engines[engine_name]
 | 
	
		
			
			| 37 | 39 |      try:
 | 
	
		
			
			| 38 |  | -        return fn(url, **kwargs)
 | 
	
		
			
			|  | 40 | +        ret = fn(url, **kwargs)
 | 
	
		
			
			|  | 41 | +        with threading.RLock():
 | 
	
		
			
			|  | 42 | +            engine.continuous_errors = 0
 | 
	
		
			
			|  | 43 | +            engine.suspend_end_time = 0
 | 
	
		
			
			| 39 | 44 |      except:
 | 
	
		
			
			| 40 | 45 |          # increase errors stats
 | 
	
		
			
			| 41 | 46 |          with threading.RLock():
 | 
	
		
			
			| 42 |  | -            engines[engine_name].stats['errors'] += 1
 | 
	
		
			
			|  | 47 | +            engine.stats['errors'] += 1
 | 
	
		
			
			|  | 48 | +            engine.continuous_errors += 1
 | 
	
		
			
			|  | 49 | +            engine.suspend_end_time = time() + min(60, engine.continuous_errors)
 | 
	
		
			
			| 43 | 50 |  
 | 
	
		
			
			| 44 | 51 |          # print engine name and specific error message
 | 
	
		
			
			| 45 | 52 |          logger.exception('engine crash: {0}'.format(engine_name))
 | 
	
		
			
			| 46 |  | -        return
 | 
	
		
			
			|  | 53 | +    return ret
 | 
	
		
			
			| 47 | 54 |  
 | 
	
		
			
			| 48 | 55 |  
 | 
	
		
			
			| 49 | 56 |  def threaded_requests(requests):
 | 
	
	
		
			
			|  | @@ -241,6 +248,10 @@ class Search(object):
 | 
	
		
			
			| 241 | 248 |                                      for engine in categories[categ]
 | 
	
		
			
			| 242 | 249 |                                      if (engine.name, categ) not in self.blocked_engines)
 | 
	
		
			
			| 243 | 250 |  
 | 
	
		
			
			|  | 251 | +        # remove suspended engines
 | 
	
		
			
			|  | 252 | +        self.engines = [e for e in self.engines
 | 
	
		
			
			|  | 253 | +                        if engines[e['name']].suspend_end_time <= time()]
 | 
	
		
			
			|  | 254 | +
 | 
	
		
			
			| 244 | 255 |      # do search-request
 | 
	
		
			
			| 245 | 256 |      def search(self, request):
 | 
	
		
			
			| 246 | 257 |          global number_of_searches
 |