Skip to content

Potential starvation with connection pool #1247

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
yizhepku opened this issue Mar 18, 2025 · 0 comments
Open

Potential starvation with connection pool #1247

yizhepku opened this issue Mar 18, 2025 · 0 comments

Comments

@yizhepku
Copy link

I have the following piece of code where I initialize 100 workers and a connection pool of size 10. Each worker loops and trys to acquire a connection and hold it for 200ms.

import asyncio

import asyncpg


async def worker(pool: asyncpg.Pool):
    while True:
        async with pool.acquire(timeout=10):
            # hold the connection for 200ms
            await asyncio.sleep(0.2)


async def main():
    async with asyncpg.pool.create_pool(max_size=10) as pool:
        async with asyncio.TaskGroup() as tg:
            for _ in range(100):
                tg.create_task(worker(pool))


asyncio.run(main())

When running on my laptop, this code reliably crashes with a TimeoutError after a few minutes, meaning that at least one worker failed to acquire a connection after 10 seconds. Given that there're 10 workers per connection and each worker holds the connection for 200ms, I would expect workers to be able to acquire a connection every 2 seconds.

This looks like starvation to me. Are there fairness guarantees regarding connection pools? Is there anything I could do other than just increasing the max pool size?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant