2017-02-15 4 views
2

Ich gehe über asyncpg 's Dokumentation, und ich habe Probleme zu verstehen, warum ein Verbindungspool statt einer einzelnen Verbindung verwenden.asyncpg - Verbindung vs Verbindung Pool

Im example given wird ein Pool verwendet:

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)) 

aber auch durch die Schaffung einer Verbindung durchgeführt werden konnte, wenn nötig:

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)) 

Was ist der Vorteil von Pools über Verbindungen nach Bedarf mit ?

Antwort

5

Das Herstellen einer Verbindung zu einem Datenbankserver ist eine teure Operation. Verbindungspools sind eine gängige Technik, die es ermöglicht, diese Kosten zu vermeiden. Ein Pool hält die Verbindungen offen und vermietet sie bei Bedarf.

Es ist einfach, die Vorteile eines Pools zu sehen, indem sie eine einfache Benchmark tun:

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) 

Die oben abgeschlossen ist auf meinem Rechner in 1,568 Sekunden.

Während der Pool-Version:

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) 

Läuft in 0,234 Sekunden oder 6,7-mal schneller.

Verwandte Themen