Python socket池
项目描述
socketpool
Socketpool - 一个简单的Python socket池。
Socket池是一个支持多个工厂和后端的简单socket池。它可以很容易地被gevent、eventlet或其他任何库使用。
用法
socketpool提供了3个主要类,一个能够接受工厂和后端的ConnectionPool类,一个继承自所有连接器的接口类Connector,以及一个默认的TCP连接器TcpConnector。
使用Gevent的简单echo客户端示例
import gevent from gevent.server import StreamServer from socketpool import ConnectionPool, TcpConnector # this handler will be run for each incoming connection # in a dedicated greenlet def echo(sock, address): print ('New connection from %s:%s' % address) while True: data = sock.recv(1024) if not data: break sock.send(data) print ("echoed %r" % data) if __name__ == '__main__': import time options = {'host': 'localhost', 'port': 6000} pool = ConnectionPool(factory=TcpConnector, backend="gevent") server = StreamServer(('localhost', 6000), echo) gevent.spawn(server.serve_forever) def runpool(data): print 'ok' with pool.connection(**options) as conn: print 'sending' sent = conn.send(data) print 'send %d bytes' % sent echo_data = conn.recv(1024) print "got %s" % data assert data == echo_data start = time.time() jobs = [gevent.spawn(runpool, "blahblah") for _ in xrange(20)] gevent.joinall(jobs) delay = time.time() - start
连接器示例
class TcpConnector(Connector): def __init__(self, host, port, backend_mod, pool=None): self._s = backend_mod.Socket(socket.AF_INET, socket.SOCK_STREAM) self._s.connect((host, port)) self.host = host self.port = port self._connected = True self._life = time.time() self._pool = pool def __del__(self): self.release() def matches(self, **match_options): target_host = match_options.get('host') target_port = match_options.get('port') return target_host == self.host and target_port == self.port def is_connected(self): return self._connected def handle_exception(self, exception): print 'got an exception' print str(exception) def get_lifetime(self): return self._life def invalidate(self): self._s.close() self._connected = False self._life = -1 def release(self): if self._pool is not None: if self._connected: self._pool.release_connection(self) else: self._pool = None def send(self, data): return self._s.send(data) def recv(self, size=1024): return self._s.recv(size)
许可证
socketpool可在公共领域获得(见UNLICENSE)。socketpool还可在MIT许可证下可选地获得(见LICENSE),特别适用于不承认公共领域作品的司法管辖区。
项目详情
关闭
socketpool-0.5.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a06733434a56c4b60b8fcaa168102d2386253d36425804d55532a6bbbda6e2ec |
|
MD5 | 24f542abc27293bf40c5223f2f8fb966 |
|
BLAKE2b-256 | d139fae99a735227234ffec389b252c6de2bc7816bf627f56b4c558dc46c85aa |