on master help sign in
[fix] proper search timeout handling
commita5324d9d820fbe03c0898117cac3857477ed71ef authorAdam Tauber <asciimoo@gmail.com> dateSun 14 Dec 2014, 01:18 (12 years ago) parentf5aec98
1 file changed+19−6
searx/search.py+19−6
searx/search.py+19−6
@@ -21,6 +21,8 @@ import re
2121from itertools import izip_longest, chain
2222from datetime import datetime
2323from operator import itemgetter
24+from Queue import Queue
25+from time import time
2426from urlparse import urlparse, unquote
2527from searx.engines import (
2628 categories, engines
@@ -34,6 +36,8 @@ number_of_searches = 0
3436
3537
3638def threaded_requests(requests):
39+ timeout_limit = max(r[2]['timeout'] for r in requests)
40+ search_start = time()
3741 for fn, url, request_args in requests:
3842 th = threading.Thread(
3943 target=fn,
@@ -45,7 +49,11 @@ def threaded_requests(requests):
4549
4650 for th in threading.enumerate():
4751 if th.name == 'search_request':
48− th.join()
52+ remaining_time = max(0.0, timeout_limit - (time() - search_start))
53+ th.join(remaining_time)
54+ if th.isAlive():
55+ print('engine timeout')
56+
4957
5058
5159# get default reqest parameter
@@ -56,7 +64,7 @@ def default_request_params():
5664
5765# create a callback wrapper for the search engine results
5866def make_callback(engine_name,
59− results,
67+ results_queue,
6068 suggestions,
6169 answers,
6270 infoboxes,
@@ -74,7 +82,7 @@ def make_callback(engine_name,
7482 except Exception, e:
7583 # increase errors stats
7684 engines[engine_name].stats['errors'] += 1
77− results[engine_name] = cb_res
85+ results_queue.put_nowait((engine_name, cb_res))
7886
7987 # print engine name and specific error message
8088 print '[E] Error with engine "{0}":\n\t{1}'.format(
@@ -104,7 +112,7 @@ def make_callback(engine_name,
104112 # append result
105113 cb_res.append(result)
106114
107− results[engine_name] = cb_res
115+ results_queue.put_nowait((engine_name, cb_res))
108116
109117 # update stats with current page-load-time
110118 engines[engine_name].stats['page_load_time'] += \
@@ -420,7 +428,7 @@ class Search(object):
420428
421429 # init vars
422430 requests = []
423− results = {}
431+ results_queue = Queue()
424432 suggestions = set()
425433 answers = set()
426434 infoboxes = []
@@ -468,7 +476,7 @@ class Search(object):
468476 # create a callback wrapper for the search engine results
469477 callback = make_callback(
470478 selected_engine['name'],
471− results,
479+ results_queue,
472480 suggestions,
473481 answers,
474482 infoboxes,
@@ -502,6 +510,11 @@ class Search(object):
502510 # send all search-request
503511 threaded_requests(requests)
504512
513+ results = {}
514+ while not results_queue.empty():
515+ engine_name, engine_results = results_queue.get_nowait()
516+ results[engine_name] = engine_results
517+
505518 # update engine-specific stats
506519 for engine_name, engine_results in results.items():
507520 engines[engine_name].stats['search_count'] += 1