From ed74bccad6bfa518039038c46bae9e40e065ea0d Mon Sep 17 00:00:00 2001 From: Adam Gradzki Date: Sat, 11 Mar 2017 17:52:28 -0600 Subject: [PATCH] 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 --- examples/sanic_asyncpg_example.py | 49 ++++++++++++++----------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/examples/sanic_asyncpg_example.py b/examples/sanic_asyncpg_example.py index 2f767a46..9e2b6c65 100644 --- a/examples/sanic_asyncpg_example.py +++ b/examples/sanic_asyncpg_example.py @@ -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': '' } + 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)