Package restkit :: Package pool :: Module monitored
[hide private]
[frames] | no frames]

Source Code for Module restkit.pool.monitored

  1  # -*- coding: utf-8 - 
  2  # 
  3  # This file is part of restkit released under the MIT license.  
  4  # See the NOTICE for more information. 
  5   
  6  import socket 
  7   
  8  from restkit.pool.base import BasePool 
  9  from restkit.util import sock 
 10   
11 -class MonitoredHost(object):
12
13 - def __init__(self, keepalive, timeout):
14 self.keepalive = keepalive 15 self.timeout = timeout 16 self.nb_connections = 0 17 self.alive = dict() 18 self.init_pool()
19
20 - def get(self):
21 while self.nb_connections: 22 self.nb_connections -= 1 23 conn = self.do_get() 24 try: 25 _ = conn.fileno() 26 return conn 27 except socket.error: 28 """ connection probably closed """ 29 continue 30 return None
31
32 - def put(self, conn):
33 if self.nb_connections < self.keepalive and not self.waiting(): 34 sock.close(conn) 35 return 36 self.nb_connections += 1 37 self.do_put(conn) 38 self.monitor(conn)
39
40 - def clear(self):
41 while self.nb_connections: 42 conn = self.get() 43 sock.close(conn)
44
45 - def expire(self, fno):
46 if fno in self.alive: 47 conn = self.alive.pop(fno) 48 sock.close(conn)
49
50 - def monitor(self, conn):
51 self.alive[conn.fileno()] = conn
52
53 - def init_pool(self):
54 raise NotImplementedError
55
56 - def do_get(self):
57 raise NotImplementedError
58
59 - def do_put(self, conn):
60 raise NotImplementedError
61
62 - def waiting(self):
63 raise NotImplementedError
64 65
66 -class MonitoredPool(BasePool):
67 68 HOST_CLASS = None 69
70 - def __init__(self, *args, **kwargs):
71 BasePool.__init__(self, *args, **kwargs) 72 self._hosts = {}
73
74 - def get(self, netloc):
75 if netloc not in self._hosts: 76 return 77 host = self._hosts[netloc] 78 return host.get()
79
80 - def put(self, netloc, conn):
81 if netloc in self._hosts: 82 host = self._hosts[netloc] 83 else: 84 host = self.HOST_CLASS(self.keepalive, self.timeout) 85 self._hosts[netloc] = host 86 host.put(conn)
87
88 - def clear_host(self, netloc):
89 if netloc not in self._hosts: 90 return 91 host = self._hosts[netloc] 92 host.clear() 93 del self._hosts[netloc]
94
95 - def clear(self):
96 for netloc, host in self._hosts.items(): 97 host.clear() 98 del self._hosts[netloc]
99