{"id":16889594,"url":"https://github.com/benoitc/socketpool","last_synced_at":"2025-04-05T17:07:17.322Z","repository":{"id":2272571,"uuid":"3229256","full_name":"benoitc/socketpool","owner":"benoitc","description":"Generic socket pool","archived":false,"fork":false,"pushed_at":"2021-06-29T09:20:07.000Z","size":75,"stargazers_count":165,"open_issues_count":10,"forks_count":33,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-03-29T16:07:22.831Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/benoitc.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-01-20T20:06:44.000Z","updated_at":"2024-11-12T07:12:00.000Z","dependencies_parsed_at":"2022-09-19T10:10:26.318Z","dependency_job_id":null,"html_url":"https://github.com/benoitc/socketpool","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benoitc%2Fsocketpool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benoitc%2Fsocketpool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benoitc%2Fsocketpool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benoitc%2Fsocketpool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/benoitc","download_url":"https://codeload.github.com/benoitc/socketpool/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247369952,"owners_count":20927928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T16:57:52.463Z","updated_at":"2025-04-05T17:07:17.303Z","avatar_url":"https://github.com/benoitc.png","language":"Python","readme":"socketpool\n----------\n\nSocketpool - a simple Python socket pool.\n\nSocket pool is a simple socket pool that suports multiple factories and\nbackends. It can easily be used by gevent, eventlet or any other library.\n\nUsage\n-----\n\nsocketpool offers 3 main classes, a `ConnectionPool` class able to\naccept a factory and a backend, `Connector` an interface class\ninherited by all connectors and a default TCP connector `TcpConnector` .\n\n\nExample of a simple echo client using Gevent\n--------------------------------------------\n\n::\n\n    import gevent\n    from gevent.server import StreamServer\n\n    from socketpool import ConnectionPool, TcpConnector\n\n    # this handler will be run for each incoming connection\n    # in a dedicated greenlet\n    def echo(sock, address):\n        print ('New connection from %s:%s' % address)\n\n        while True:\n            data = sock.recv(1024)\n            if not data:\n                break\n            sock.send(data)\n            print (\"echoed %r\" % data)\n\n\n\n    if __name__ == '__main__':\n        import time\n\n        options = {'host': 'localhost', 'port': 6000}\n        pool = ConnectionPool(factory=TcpConnector, backend=\"gevent\")\n        server = StreamServer(('localhost', 6000), echo)\n        gevent.spawn(server.serve_forever)\n\n\n        def runpool(data):\n            print 'ok'\n            with pool.connection(**options) as conn:\n                print 'sending'\n                sent = conn.send(data)\n                print 'send %d bytes' % sent\n                echo_data = conn.recv(1024)\n                print \"got %s\" % data\n                assert data == echo_data\n\n        start = time.time()\n        jobs = [gevent.spawn(runpool, \"blahblah\") for _ in xrange(20)]\n\n        gevent.joinall(jobs)\n        delay = time.time() - start\n\n\nExample of a connector\n----------------------\n\n::\n\n    class TcpConnector(Connector):\n\n        def __init__(self, host, port, backend_mod, pool=None):\n            self._s = backend_mod.Socket(socket.AF_INET, socket.SOCK_STREAM)\n            self._s.connect((host, port))\n            self.host = host\n            self.port = port\n            self._connected = True\n            self._life = time.time()\n            self._pool = pool\n    \n        def __del__(self):\n            self.release()\n\n        def matches(self, **match_options):\n            target_host = match_options.get('host')\n            target_port = match_options.get('port')\n            return target_host == self.host and target_port == self.port\n\n        def is_connected(self):\n            return self._connected\n\n        def handle_exception(self, exception):\n            print 'got an exception'\n            print str(exception)\n\n        def get_lifetime(self):\n            return self._life\n\n        def invalidate(self):\n            self._s.close()\n            self._connected = False\n            self._life = -1\n\n        def release(self):\n            if self._pool is not None:\n                if self._connected:\n                    self._pool.release_connection(self)\n                else:\n                    self._pool = None\n\n        def send(self, data):\n            return self._s.send(data)\n\n        def recv(self, size=1024):\n            return self._s.recv(size)\n\n\nAuthors\n-------\n\n- Benoît Chesneau (benoitc) \u003cbenoitc@e-engura.org\u003e\n- Tarek Ziade (tarek) \u003ctarek@ziade.org\u003e\n\nLicense\n-------\n\nsocketpool is available in the public domain (see UNLICENSE). socketpool\nis also optionally available under the MIT License (see LICENSE), meant\nespecially for jurisdictions that do not recognize public domain works.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenoitc%2Fsocketpool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenoitc%2Fsocketpool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenoitc%2Fsocketpool/lists"}