1
2
3
4
5
6 """ Thread-safe pool """
7
8 import time
9
10 from restkit.pool.base import BasePool
11 from restkit.util import sock
12 from restkit.util.rwlock import RWLock
13
14 import collections
15
17
19 self.keepalive = keepalive
20 self.timeout = timeout
21 self.connections = collections.deque()
22
24 while len(self.connections):
25 conn, expires = self.connections.popleft()
26 if expires < time.time():
27 return conn
28 return None
29
30 - def put(self, conn):
36
41
43
48
49 - def get(self, netloc):
50 self._lock.reader_enters()
51 try:
52 if netloc not in self._hosts:
53 return
54 host = self._hosts[netloc]
55 conn = host.get()
56 return conn
57 finally:
58 self._lock.reader_leaves()
59
60 - def put(self, netloc, conn):
61 self._lock.writer_enters()
62 try:
63 if netloc not in self._hosts:
64 host = Host(self.keepalive, self.timeout)
65 self._hosts[netloc] = host
66 else:
67 host = self._hosts[netloc]
68 host.put(conn)
69 finally:
70 self._lock.writer_leaves()
71
73 self._lock.writer_enters()
74 try:
75 if netloc not in self._hosts:
76 return
77 host = self._hosts[netloc]
78 host.clear()
79 finally:
80 self._lock.writer_leaves()
81
83 self._lock.writer_enters()
84 try:
85 for netloc, host in self._hosts:
86 host.clear()
87 del self._hosts[netloc]
88 finally:
89 self._lock.writer_leaves()
90