Faster asyncpg queries via a global connection pool

In my benchmarks I was able to obtain a 17% performance
improvement over the current asyncpg demo code with a shared
connection pool.

Resolves: #540
See also: #531
This commit is contained in:
Adam Gradzki 2017-03-11 17:52:28 -06:00
parent 88bf78213f
commit ed74bccad6

View File

@ -1,11 +1,8 @@
""" To run this example you need additional asyncpg package
"""
import os
import asyncio
import uvloop
from asyncpg import connect
from asyncpg import connect, create_pool
from sanic import Sanic
from sanic.response import json
@ -18,39 +15,37 @@ DB_CONFIG = {
'database': '<database>'
}
def jsonify(records):
"""
Parse asyncpg record response into JSON format
"""
return [dict(r.items()) for r in records]
app = Sanic(__name__)
@app.listener('before_server_start')
async def create_db(app, loop):
"""
Create some table and add some data
"""
conn = await connect(**DB_CONFIG)
await conn.execute('DROP TABLE IF EXISTS sanic_post')
await conn.execute("""CREATE TABLE sanic_post (
id serial primary key,
content varchar(50),
post_date timestamp);"""
)
for i in range(0, 100):
await conn.execute(f"""INSERT INTO sanic_post
(id, content, post_date) VALUES ({i}, {i}, now())""")
await conn.close()
async def register_db(app, loop):
app.pool = await create_pool(**DB_CONFIG, loop=loop, max_size=100)
async with app.pool.acquire() as connection:
await connection.execute('DROP TABLE IF EXISTS sanic_post')
await connection.execute("""CREATE TABLE sanic_post (
id serial primary key,
content varchar(50),
post_date timestamp
);""")
for i in range(0, 1000):
await connection.execute(f"""INSERT INTO sanic_post
(id, content, post_date) VALUES ({i}, {i}, now())""")
@app.route("/")
async def handler(request):
conn = await connect(**DB_CONFIG)
results = await conn.fetch('SELECT * FROM sanic_post')
await conn.close()
return json({'posts': jsonify(results)})
@app.get('/')
async def root_get(request):
async with app.pool.acquire() as connection:
results = await connection.fetch('SELECT * FROM sanic_post')
return json({'posts': jsonify(results)})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
app.run(host='127.0.0.1', port=8080)