Browse Source

[mod] strict timeout handling

Adam Tauber 10 years ago
parent
commit
77c3a27f56
1 changed files with 14 additions and 18 deletions
  1. 14
    18
      searx/search.py

+ 14
- 18
searx/search.py View File

19
 import threading
19
 import threading
20
 import re
20
 import re
21
 from itertools import izip_longest, chain
21
 from itertools import izip_longest, chain
22
-from datetime import datetime
23
 from operator import itemgetter
22
 from operator import itemgetter
24
 from Queue import Queue
23
 from Queue import Queue
25
 from time import time
24
 from time import time
39
     timeout_limit = max(r[2]['timeout'] for r in requests)
38
     timeout_limit = max(r[2]['timeout'] for r in requests)
40
     search_start = time()
39
     search_start = time()
41
     for fn, url, request_args in requests:
40
     for fn, url, request_args in requests:
41
+        request_args['timeout'] = timeout_limit
42
         th = threading.Thread(
42
         th = threading.Thread(
43
             target=fn,
43
             target=fn,
44
             args=(url,),
44
             args=(url,),
63
 
63
 
64
 
64
 
65
 # create a callback wrapper for the search engine results
65
 # create a callback wrapper for the search engine results
66
-def make_callback(engine_name,
67
-                  results_queue,
68
-                  suggestions,
69
-                  answers,
70
-                  infoboxes,
71
-                  callback,
72
-                  params):
66
+def make_callback(engine_name, results_queue, callback, params):
73
 
67
 
74
     # creating a callback wrapper for the search engine results
68
     # creating a callback wrapper for the search engine results
75
     def process_callback(response, **kwargs):
69
     def process_callback(response, **kwargs):
87
                 engine_name, str(e))
81
                 engine_name, str(e))
88
             return
82
             return
89
 
83
 
84
+        timeout_overhead = 0.2  # seconds
85
+        search_duration = time() - params['started']
86
+        timeout_limit = engines[engine_name].timeout + timeout_overhead
87
+        if search_duration > timeout_limit:
88
+            engines[engine_name].stats['page_load_time'] += timeout_limit
89
+            engines[engine_name].stats['errors'] += 1
90
+            return
91
+
90
         # add results
92
         # add results
91
         for result in search_results:
93
         for result in search_results:
92
             result['engine'] = engine_name
94
             result['engine'] = engine_name
94
         results_queue.put_nowait((engine_name, search_results))
96
         results_queue.put_nowait((engine_name, search_results))
95
 
97
 
96
         # update stats with current page-load-time
98
         # update stats with current page-load-time
97
-        engines[engine_name].stats['page_load_time'] += \
98
-            (datetime.now() - params['started']).total_seconds()
99
+        engines[engine_name].stats['page_load_time'] += search_duration
99
 
100
 
100
     return process_callback
101
     return process_callback
101
 
102
 
439
             request_params = default_request_params()
440
             request_params = default_request_params()
440
             request_params['headers']['User-Agent'] = user_agent
441
             request_params['headers']['User-Agent'] = user_agent
441
             request_params['category'] = selected_engine['category']
442
             request_params['category'] = selected_engine['category']
442
-            request_params['started'] = datetime.now()
443
+            request_params['started'] = time()
443
             request_params['pageno'] = self.pageno
444
             request_params['pageno'] = self.pageno
444
             request_params['language'] = self.lang
445
             request_params['language'] = self.lang
445
 
446
 
446
             # update request parameters dependent on
447
             # update request parameters dependent on
447
             # search-engine (contained in engines folder)
448
             # search-engine (contained in engines folder)
448
-            request_params = engine.request(self.query.encode('utf-8'),
449
-                                            request_params)
449
+            engine.request(self.query.encode('utf-8'), request_params)
450
 
450
 
451
             if request_params['url'] is None:
451
             if request_params['url'] is None:
452
                 # TODO add support of offline engines
452
                 # TODO add support of offline engines
456
             callback = make_callback(
456
             callback = make_callback(
457
                 selected_engine['name'],
457
                 selected_engine['name'],
458
                 results_queue,
458
                 results_queue,
459
-                suggestions,
460
-                answers,
461
-                infoboxes,
462
                 engine.response,
459
                 engine.response,
463
-                request_params
464
-            )
460
+                request_params)
465
 
461
 
466
             # create dictionary which contain all
462
             # create dictionary which contain all
467
             # informations about the request
463
             # informations about the request