Skip to content

Commit 5b4817b

Browse files
samuelcolvinNateBrady23
authored andcommitted
pthon/aiohttp correct which randomNumber is returned by 'update' (#2555)
* correct with randomNumber is returned by 'update' * Aiohttp faster (#1) marginal performance improvements and cleanup [ci fw-only Python/aiohttp]
1 parent 2d2d599 commit 5b4817b

File tree

4 files changed

+55
-46
lines changed

4 files changed

+55
-46
lines changed

frameworks/Python/aiohttp/app/main.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
updates_raw,
2323
)
2424

25+
CONNECTION_ORM = os.getenv('CONNECTION', 'ORM').upper() == 'ORM'
26+
2527
THIS_DIR = Path(__file__).parent
2628

2729

@@ -41,30 +43,34 @@ def pg_dsn() -> str:
4143

4244
async def startup(app: web.Application):
4345
dsn = pg_dsn()
44-
app.update(
45-
aiopg_engine=await aiopg.sa.create_engine(dsn=dsn, minsize=10, maxsize=20, loop=app.loop),
46-
asyncpg_pool=await asyncpg.create_pool(dsn=dsn, min_size=10, max_size=20, loop=app.loop),
47-
)
46+
min_size, max_size = 50, 100
47+
if CONNECTION_ORM:
48+
app['pg'] = await aiopg.sa.create_engine(dsn=dsn, minsize=min_size, maxsize=max_size, loop=app.loop)
49+
else:
50+
app['pg'] = await asyncpg.create_pool(dsn=dsn, min_size=min_size, max_size=max_size, loop=app.loop)
4851

4952

5053
async def cleanup(app: web.Application):
51-
app['aiopg_engine'].close()
52-
await app['aiopg_engine'].wait_closed()
53-
await app['asyncpg_pool'].close()
54+
if CONNECTION_ORM:
55+
app['pg'].close()
56+
await app['pg'].wait_closed()
57+
else:
58+
await app['pg'].close()
5459

5560

5661
def setup_routes(app):
57-
app.router.add_get('/json', json)
58-
app.router.add_get('/db', single_database_query_orm)
59-
app.router.add_get('/queries', multiple_database_queries_orm)
60-
app.router.add_get('/fortunes', fortunes)
61-
app.router.add_get('/updates', updates)
62-
app.router.add_get('/plaintext', plaintext)
63-
64-
app.router.add_get('/raw/db', single_database_query_raw)
65-
app.router.add_get('/raw/queries', multiple_database_queries_raw)
66-
app.router.add_get('/raw/fortunes', fortunes_raw)
67-
app.router.add_get('/raw/updates', updates_raw)
62+
if CONNECTION_ORM:
63+
app.router.add_get('/json', json)
64+
app.router.add_get('/db', single_database_query_orm)
65+
app.router.add_get('/queries/{queries:.*}', multiple_database_queries_orm)
66+
app.router.add_get('/fortunes', fortunes)
67+
app.router.add_get('/updates/{queries:.*}', updates)
68+
app.router.add_get('/plaintext', plaintext)
69+
else:
70+
app.router.add_get('/db', single_database_query_raw)
71+
app.router.add_get('/queries/{queries:.*}', multiple_database_queries_raw)
72+
app.router.add_get('/fortunes', fortunes_raw)
73+
app.router.add_get('/updates/{queries:.*}', updates_raw)
6874

6975

7076
def create_app(loop):

frameworks/Python/aiohttp/app/views.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def json_response(data):
1717

1818
def get_num_queries(request):
1919
try:
20-
num_queries = int(request.GET.get('queries', 1))
20+
num_queries = int(request.match_info.get('queries', 1))
2121
except ValueError:
2222
return 1
2323
if num_queries < 1:
@@ -39,7 +39,7 @@ async def single_database_query_orm(request):
3939
Test 2 ORM
4040
"""
4141
id_ = randint(1, 10000)
42-
async with request.app['aiopg_engine'].acquire() as conn:
42+
async with request.app['pg'].acquire() as conn:
4343
cur = await conn.execute(select([sa_worlds.c.randomnumber]).where(sa_worlds.c.id == id_))
4444
r = await cur.first()
4545
return json_response({'id': id_, 'randomNumber': r[0]})
@@ -51,7 +51,7 @@ async def single_database_query_raw(request):
5151
"""
5252
id_ = randint(1, 10000)
5353

54-
async with request.app['asyncpg_pool'].acquire() as conn:
54+
async with request.app['pg'].acquire() as conn:
5555
r = await conn.fetchval('SELECT randomnumber FROM world WHERE id = $1', id_)
5656
return json_response({'id': id_, 'randomNumber': r})
5757

@@ -66,7 +66,7 @@ async def multiple_database_queries_orm(request):
6666
ids.sort()
6767

6868
result = []
69-
async with request.app['aiopg_engine'].acquire() as conn:
69+
async with request.app['pg'].acquire() as conn:
7070
for id_ in ids:
7171
cur = await conn.execute(select([sa_worlds.c.randomnumber]).where(sa_worlds.c.id == id_))
7272
r = await cur.first()
@@ -84,7 +84,7 @@ async def multiple_database_queries_raw(request):
8484
ids.sort()
8585

8686
result = []
87-
async with request.app['asyncpg_pool'].acquire() as conn:
87+
async with request.app['pg'].acquire() as conn:
8888
stmt = await conn.prepare('SELECT randomnumber FROM world WHERE id = $1')
8989
for id_ in ids:
9090
result.append({
@@ -99,7 +99,7 @@ async def fortunes(request):
9999
"""
100100
Test 4 ORM
101101
"""
102-
async with request.app['aiopg_engine'].acquire() as conn:
102+
async with request.app['pg'].acquire() as conn:
103103
cur = await conn.execute(select([sa_fortunes.c.id, sa_fortunes.c.message]))
104104
fortunes = list(await cur.fetchall())
105105
fortunes.append(Fortune(id=0, message='Additional fortune added at request time.'))
@@ -112,7 +112,7 @@ async def fortunes_raw(request):
112112
"""
113113
Test 4 RAW
114114
"""
115-
async with request.app['asyncpg_pool'].acquire() as conn:
115+
async with request.app['pg'].acquire() as conn:
116116
fortunes = await conn.fetch('SELECT * FROM Fortune')
117117
fortunes.append(dict(id=0, message='Additional fortune added at request time.'))
118118
fortunes.sort(key=itemgetter('message'))
@@ -129,21 +129,21 @@ async def updates(request):
129129
ids = [randint(1, 10000) for _ in range(num_queries)]
130130
ids.sort()
131131

132-
async with request.app['aiopg_engine'].acquire() as conn:
132+
async with request.app['pg'].acquire() as conn:
133133
for id_ in ids:
134134
cur = await conn.execute(
135135
select([sa_worlds.c.randomnumber])
136136
.where(sa_worlds.c.id == id_)
137137
)
138-
r = await cur.first()
139-
r = dict(r)
140-
r['randomnumber'] = randint(1, 10000)
138+
# the result of this is a dict with the previous random number `randomnumber` which we don't actually use
139+
await cur.first()
140+
rand_new = randint(1, 10000)
141141
await conn.execute(
142142
sa_worlds.update()
143143
.where(sa_worlds.c.id == id_)
144-
.values(randomnumber=r['randomnumber'])
144+
.values(randomnumber=rand_new)
145145
)
146-
result.append({'id': id_, 'randomNumber': r['randomnumber']})
146+
result.append({'id': id_, 'randomNumber': rand_new})
147147
return json_response(result)
148148

149149
async def updates_raw(request):
@@ -157,16 +157,14 @@ async def updates_raw(request):
157157

158158
result = []
159159
updates = []
160-
async with request.app['asyncpg_pool'].acquire() as conn:
160+
async with request.app['pg'].acquire() as conn:
161161
stmt = await conn.prepare('SELECT randomnumber FROM world WHERE id = $1')
162162
for id_ in ids:
163-
r = {
164-
'id': id_,
165-
'randomNumber': await stmt.fetchval(id_)
166-
}
167-
r['randomNumber'] = randint(1, 10000)
168-
result.append(r)
169-
updates.append((r['randomNumber'], id_))
163+
# the result of this is the int previous random number which we don't actually use
164+
await stmt.fetchval(id_)
165+
rand_new = randint(1, 10000)
166+
result.append({'id': id_, 'randomNumber': rand_new})
167+
updates.append((rand_new, id_))
170168
await conn.executemany('UPDATE world SET randomnumber=$1 WHERE id=$2', updates)
171169

172170
return json_response(result)

frameworks/Python/aiohttp/benchmark_config.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
"setup_file": "setup",
66
"json_url": "/json",
77
"db_url": "/db",
8-
"query_url": "/queries?queries=",
8+
"query_url": "/queries/",
99
"fortune_url": "/fortunes",
10-
"update_url": "/updates?queries=",
10+
"update_url": "/updates/",
1111
"plaintext_url": "/plaintext",
1212
"port": 8080,
1313
"approach": "Realistic",
@@ -25,11 +25,11 @@
2525
"notes": "uses aiopg with sqlalchemy for database access"
2626
},
2727
"pg-raw": {
28-
"setup_file": "setup",
29-
"db_url": "/raw/db",
30-
"query_url": "/raw/queries?queries=",
31-
"fortune_url": "/raw/fortunes",
32-
"update_url": "/raw/updates?queries=",
28+
"setup_file": "setup_raw",
29+
"db_url": "/db",
30+
"query_url": "/queries/",
31+
"fortune_url": "/fortunes",
32+
"update_url": "/updates/",
3333
"port": 8080,
3434
"approach": "Realistic",
3535
"classification": "Micro",
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash
2+
3+
export CONNECTION=RAW
4+
5+
source $TROOT/setup.sh

0 commit comments

Comments
 (0)