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