Revision 376561666438 () - Diff

Link to this snippet: https://friendpaste.com/5Hy6BDknMItVzZ4XX3RtHf
Embed:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
diff --git a/socketpool/backend_eventlet.py b/socketpool/backend_eventlet.py
index c86411e..9a93a57 100644
--- a/socketpool/backend_eventlet.py
+++ b/socketpool/backend_eventlet.py
@@ -4,6 +4,7 @@
# See the NOTICE for more information.
import eventlet
+from eventlet.green import select
from eventlet.green import socket
from eventlet import queue
@@ -11,6 +12,7 @@ from socketpool.pool import ConnectionPool
sleep = eventlet.sleep
Socket = socket.socket
+Select = select.select
class PriorityQueue(queue.PriorityQueue):
diff --git a/socketpool/backend_gevent.py b/socketpool/backend_gevent.py
index ce5ba12..5d44536 100644
--- a/socketpool/backend_gevent.py
+++ b/socketpool/backend_gevent.py
@@ -4,6 +4,7 @@
# See the NOTICE for more information.
import gevent
+from gevent import select
from gevent import socket
from gevent import queue
@@ -12,7 +13,7 @@ from socketpool.pool import ConnectionPool
sleep = gevent.sleep
PriorityQueue = queue.PriorityQueue
Socket = socket.socket
-
+Select = select.select
class ConnectionReaper(gevent.Greenlet):
diff --git a/socketpool/backend_thread.py b/socketpool/backend_thread.py
index 621edd4..ae8f751 100644
--- a/socketpool/backend_thread.py
+++ b/socketpool/backend_thread.py
@@ -12,9 +12,11 @@ try:
except ImportError: # py3
import queue
+Select = select.select
Socket = socket.socket
sleep = time.sleep
+
class PriorityQueue(queue.PriorityQueue):
def __iter__(self):
diff --git a/socketpool/conn.py b/socketpool/conn.py
index 3d92618..f81ced2 100644
--- a/socketpool/conn.py
+++ b/socketpool/conn.py
@@ -3,6 +3,7 @@
# This file is part of socketpool.
# See the NOTICE for more information.
+import select
import socket
import time
@@ -30,6 +31,7 @@ class TcpConnector(Connector):
self._s.connect((host, port))
self.host = host
self.port = port
+ self.backend_mod = backend_mod
self._connected = True
self._life = time.time()
@@ -39,7 +41,15 @@ class TcpConnector(Connector):
return target_host == self.host and target_port == self.port
def is_connected(self):
- return self._connected
+ if self._connected:
+ try:
+ r, _, _ = self.backend_mod.Select([self._s], [], [], 0)
+ if not r:
+ return True
+ except (ValueError, select.error,):
+ return False
+ self.close()
+ return False
def handle_exception(self, exception):
print 'got an exception'
diff --git a/socketpool/pool.py b/socketpool/pool.py
index 2d68d27..9048fca 100644
--- a/socketpool/pool.py
+++ b/socketpool/pool.py
@@ -89,8 +89,9 @@ class ConnectionPool(object):
# let's put it back
self.pool.put((priority, candidate))
else:
- found = candidate
- break
+ if candidate.is_connected():
+ found = candidate
+ break
if i <= 0:
break