Skip to main content

An asyncio-compatible socket pool

Project description

Code style: black CI

aiosocketpool

An asyncio-compatible socket pool. Simple, compact, easily extended.

If your application needs to connect to many remote hosts simultaneously (and often), it probably makes sense to keep connections open and re-use them rather than establishing a new connection for every request. Combining an asyncio event loop and a socket pool might be the way to go!

Based on socketpool.

Requires Python 3.8 or above.

Examples

You can run these examples, one after another, in a python -m asyncio shell.

  1. Run a simple TCP echo server in a background thread, using the asyncio library.
import asyncio
import threading


# start a new event loop running in a background thread
def run_loop_forever(loop):
    loop.run_forever()


loop = asyncio.new_event_loop()

t = threading.Thread(name="BackgroundEventLoop", target=run_loop_forever, args=[loop], daemon=True)
t.start()


# run a tcp echo server using asyncio in the background event loop
async def echo_handler(reader, writer):
    try:
        while True:
            try:
                data = await reader.readuntil(b'\n')
            except asyncio.IncompleteReadError:
                break

            writer.write(data)
            await writer.drain()

    finally:
        writer.close()
        await writer.wait_closed()


async def echo_server(tcp_port):
    server = await asyncio.start_server(echo_handler, "127.0.0.1", tcp_port)
    await server.serve_forever()


asyncio.run_coroutine_threadsafe(echo_server(12345), loop)
  1. Create a new TCP connection pool in the main thread, get a connection, and send and receive data.
from aiosocketpool import AsyncConnectionPool, AsyncTcpConnector


pool = AsyncConnectionPool(
    factory=AsyncTcpConnector,
    reap_connections=True,  # a background task will destroy old and idle connections
    max_lifetime=10,  # connections will remain idle at most 10 seconds
    max_size=10,  # we will maintain at most 10 idle connections in the pool
)


async def hello_world():
    async with pool.connection(host="127.0.0.1", port=12345) as conn:
        await conn.sendall(b"hello world\n")
        print(await conn.recv(32))


await hello_world()
  1. Create a bunch of connections and run them all concurrently.
tasks = []

for _ in range(25):
    tasks.append(asyncio.create_task(hello_world()))

await asyncio.gather(*tasks)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiosocketpool-0.0.6.tar.gz (9.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aiosocketpool-0.0.6-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file aiosocketpool-0.0.6.tar.gz.

File metadata

  • Download URL: aiosocketpool-0.0.6.tar.gz
  • Upload date:
  • Size: 9.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for aiosocketpool-0.0.6.tar.gz
Algorithm Hash digest
SHA256 b9e923971fdcd3042200291fa6e94714b6cc4ddba86662ab85be8e31b18de99e
MD5 2588394e181c384237082bf8d33bf230
BLAKE2b-256 550bd0724d3cd5c88346084c8f9b33971518f8eab1e3f74bd02c8641a03f2f29

See more details on using hashes here.

File details

Details for the file aiosocketpool-0.0.6-py3-none-any.whl.

File metadata

  • Download URL: aiosocketpool-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 8.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for aiosocketpool-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 8e2e977d566d90d429c86bf19a47e5e7a4530679fd31ce59397987e66267d80f
MD5 32a6101a486551e73169f55be064dace
BLAKE2b-256 39dc3fa4a8ae6bdb0abd76a5d415a590efe709633df97b9abedfac618dcbd762

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page