summaryrefslogtreecommitdiff
path: root/python/qpid/compat.py
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2009-10-26 15:49:02 +0000
committerRafael H. Schloming <rhs@apache.org>2009-10-26 15:49:02 +0000
commitc35e274e79604864e6911ce4999fa95e26f27768 (patch)
tree84616b85b6f4de8a7a3fbd84acf589b53dcd13b5 /python/qpid/compat.py
parent74d60c79368c1a2e70595ab33aa469e2746009c8 (diff)
downloadqpid-python-c35e274e79604864e6911ce4999fa95e26f27768.tar.gz
improved request/response performance by using an I/O based condition instead of the default condition from the python threading module
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@829837 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'python/qpid/compat.py')
-rw-r--r--python/qpid/compat.py49
1 files changed, 33 insertions, 16 deletions
diff --git a/python/qpid/compat.py b/python/qpid/compat.py
index e38f0dbe8c..c2b668a5e9 100644
--- a/python/qpid/compat.py
+++ b/python/qpid/compat.py
@@ -43,27 +43,47 @@ if tuple(sys.version_info[0:2]) < (2, 4):
else:
from select import select
+class BaseWaiter:
+
+ def wakeup(self):
+ self._do_write()
+
+ def wait(self, timeout=None):
+ if timeout is not None:
+ ready, _, _ = select([self], [], [], timeout)
+ else:
+ ready = True
+
+ if ready:
+ self._do_read()
+ return True
+ else:
+ return False
+
+ def reading(self):
+ return True
+
+ def readable(self):
+ self._do_read()
+
if sys.platform in ('win32', 'cygwin'):
import socket
- class SockWaiter:
+ class SockWaiter(BaseWaiter):
def __init__(self, read_sock, write_sock):
self.read_sock = read_sock
self.write_sock = write_sock
- def wakeup(self):
+ def _do_write(self):
self.write_sock.send("\0")
+ def _do_read(self):
+ self.read_sock.recv(65536)
+
def fileno(self):
return self.read_sock.fileno()
- def reading(self):
- return True
-
- def readable(self):
- self.read_sock.recv(65536)
-
def __repr__(self):
return "SockWaiter(%r, %r)" % (self.read_sock, self.write_sock)
@@ -80,24 +100,21 @@ if sys.platform in ('win32', 'cygwin'):
else:
import os
- class PipeWaiter:
+ class PipeWaiter(BaseWaiter):
def __init__(self, read_fd, write_fd):
self.read_fd = read_fd
self.write_fd = write_fd
- def wakeup(self):
+ def _do_write(self):
os.write(self.write_fd, "\0")
+ def _do_read(self):
+ os.read(self.read_fd, 65536)
+
def fileno(self):
return self.read_fd
- def reading(self):
- return True
-
- def readable(self):
- os.read(self.read_fd, 65536)
-
def __repr__(self):
return "PipeWaiter(%r, %r)" % (self.read_fd, self.write_fd)