Asyncpg.pool creates more connections than its max_size
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Beginne mit asyncpg.create_pool, pool.acquire und dem im Issue gezeigten Write-Pfad. Reproduziere run_functions_concurrently mit 1000 gesammelten Tasks und vergleiche die aktiven Verbindungen von PostgreSQL mit der pool-Größe max_size von 150. Als erledigt gilt, festzustellen, ob die Anzahl der Verbindungen erwartet wird, und das beobachtete Verhalten zu dokumentieren oder zu korrigieren.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
- asyncpg version:0.29.0
- PostgreSQL version: "PostgreSQL 16.0 (Debian 16.0-1.pgdg120+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit"
- Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?: Nope, using Dockerized container - Python version: 3.11.5
- Platform: MacBook-Air Darwin Kernel Version 21.1.0: Wed Oct 13 17:33:24 PDT 2021; root:xnu-8019.41.5~1/RELEASE_ARM64_T8101 arm64
- Do you use pgbouncer?: Nope
- Did you install asyncpg with pip?: Yes
- If you built asyncpg locally, which version of Cython did you use?: n/a
- Can the issue be reproduced under both asyncio and
uvloop?:Nope
I have a singleton for a Database entity, which is then used to write some primitive data. When I run the write function 1000 times concurrently using asyncio.gather(), the database reports that there is more connections than the max_size of the asyncpg.pool. For example, when I was testing there were 857 active db connections, but only 62 active pool connections. No other clients/operations were running during the test. When I use uvloop to do the same thing, it just crashes with ConnectionResetError: [Errno 54] Connection reset by peer if I try to run more tasks than the size of the pool.
Is this a normal pool behavior?
I use code below (the write function is simplified though):
The database code:
class Database:
_instance = None
_pool = None
db_params = {
'host': os.getenv('DATABASE_HOST'),
'port': os.getenv('DATABASE_PORT'),
'database': os.getenv('DATABASE_NAME'),
'user': os.getenv('DATABASE_USER'),
'password': os.getenv('DATABASE_PASSWORD')
}
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Database, cls).__new__(cls)
#print(cls._instance)
return cls._instance
@classmethod
async def get_pool(cls):
if cls._pool is None:
cls._pool = await asyncpg.create_pool(**cls.db_params, min_size=1, max_size=150)
#print(cls._pool)
return cls._pool
@classmethod
async def write(cls, result):
pool = await cls.get_pool()
try:
async with pool.acquire() as connection:
result = await connection.execute('''
INSERT INTO tables.results(
result
) VALUES($1)
''', result)
return
except Exception as e:
raise e
The demo write code
async def fake_result(i):
print(f'generating fake result {i}')
await db.write(i)
return
async def run_functions_concurrently():
tasks = [fake_result(i) for i in range(1000)]
await asyncio.gather(*tasks)
def main():
asyncio.run(run_functions_concurrently())
if __name__ == "__main__":
main()
- Vorherrschende Sprache
- Python
- Sterne
- 8.1k
- Forks
- 474
- Ø Merge
- 1 T. 17 Std.
- Gemergte PRs (30 T.)
- 24
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus MagicStack/asyncpg
-
Failed BEGIN leaves Connection._top_xact set; every later transaction becomes a SAVEPOINT and fails with NoActiveSQLTransactionErrorEvtl. vergeben @devtechedge hat das vor 2 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 35/100
MagicStack/asyncpg#1386 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Connect call failed error doesn't distinguish port mismatch from "server not running"Evtl. vergeben @aryansk hat das vor 55 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 72/100
MagicStack/asyncpg#1342 ·
Maintainer antworten meist innerhalb von 1 Tag
-
TypeError in asyncpg.connect() for specific parameters when values are not str enoughEvtl. vergeben @pranjalm37 hat das vor 58 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 56/100
MagicStack/asyncpg#1340 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
setup.py relies on deprecated pkg_resourcesEvtl. vergeben @jasonwbarnett hat das vor 86 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 28/100
MagicStack/asyncpg#1337 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 42/100
MagicStack/asyncpg#1330 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in MagicStack/asyncpg
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
aicell-lab/bioengine#232 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
modelscope/evalscope#1836 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
-
bug
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
jbaruch/speaker-toolkit#480 ·
Maintainer antworten meist innerhalb von 1 Tag