@@ -34,16 +34,23 @@ number_of_searches = 0
3434
3535
3636def search_request_wrapper(fn, url, engine_name, **kwargs):
37+ ret = None
38+ engine = engines[engine_name]
3739 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
3944 except:
4045 # increase errors stats
4146 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)
4350
4451 # print engine name and specific error message
4552 logger.exception('engine crash: {0}'.format(engine_name))
46− return
53+ return ret
4754
4855
4956def threaded_requests(requests):
@@ -241,6 +248,10 @@ class Search(object):
241248 for engine in categories[categ]
242249 if (engine.name, categ) not in self.blocked_engines)
243250
251+ # remove suspended engines
252+ self.engines = [e for e in self.engines
253+ if engines[e['name']].suspend_end_time <= time()]
254+
244255 # do search-request
245256 def search(self, request):
246257 global number_of_searches