Estoy revisando la documentación de asyncpg
y tengo problemas para entender por qué usar un grupo de conexiones en lugar de una sola conexión.
En el ejemplo dado , se utiliza un grupo:
async with pool.acquire() as connection: async with connection.transaction(): result = await connection.fetchval('select 2 ^ $1', power) return web.Response( text="2 ^ {} is {}".format(power, result))
pero también podría hacerse creando una conexión cuando sea necesario:
connection = await asyncpg.connect(user='postgres') async with connection.transaction(): result = await connection.fetchval('select 2 ^ $1', power) return web.Response( text="2 ^ {} is {}".format(power, result))
¿Cuál es la ventaja de usar grupos sobre conexiones según sea necesario?
Establecer una conexión con un servidor de base de datos es una operación costosa. Los pools de conexión son una técnica común que permite evitar pagar ese costo. Un grupo mantiene abiertas las conexiones y las alquila cuando es necesario.
Es fácil ver los beneficios de un grupo al hacer un punto de referencia simple:
async def bench_asyncpg_con(): power = 2 start = time.monotonic() for i in range(1, 1000): con = await asyncpg.connect(user='postgres', host='127.0.0.1') await con.fetchval('select 2 ^ $1', power) await con.close() end = time.monotonic() print(end - start)
Lo anterior se completa en mi máquina en 1.568 segundos.
Mientras que la versión de la piscina:
async def bench_asyncpg_pool(): pool = await asyncpg.create_pool(user='postgres', host='127.0.0.1') power = 2 start = time.monotonic() for i in range(1, 1000): async with pool.acquire() as con: await con.fetchval('select 2 ^ $1', power) await pool.close() end = time.monotonic() print(end - start)
Corre en 0,234 segundos, o 6,7 veces más rápido .
Elvis Pranskevichus mostró dos puntos de referencia arriba. Tomé el primero bench_asyncpg_con
y lo edité, moviendo la con
fuera del bucle:
async def bench_asyncpg_con_2(): power = 2 start = time.monotonic() con = await asyncpg.connect(**data) for i in range(1, 1000): await con.fetchval('select 2 ^ $1', power) await con.close() end = time.monotonic() print(end - start)
Y esto funcionó mucho más rápido que bench_asyncpg_pool
Obtuve 0.45
en esto, mientras que obtuve
1.62
en bench_asyncpg_pool
y
63.18
en bench_asyncpg_con
Soy un poco novato en el uso de esta biblioteca y pienso que una con
para todo un proyecto sería una buena opción. Corrígeme si estoy equivocado. lo apreciaré