1
1
import multiprocessing
2
- from pathlib import Path
3
2
from random import randint , sample
4
3
5
4
import asyncpg
10
9
from panther .request import Request
11
10
from panther .response import Response , PlainTextResponse , HTMLResponse
12
11
13
- READ_ROW_SQL = 'SELECT "id", "randomnumber" FROM "world" WHERE id = $1'
14
- WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2'
15
- ADDITIONAL_ROW = [0 , 'Additional fortune added at request time.' ]
16
- MAX_POOL_SIZE = 1000 // multiprocessing .cpu_count ()
17
- MIN_POOL_SIZE = max (int (MAX_POOL_SIZE / 2 ), 1 )
12
+ cpu_count = multiprocessing .cpu_count ()
13
+ MAX_POOL_SIZE = 1000 // cpu_count
14
+ MIN_POOL_SIZE = max (MAX_POOL_SIZE // 2 , 1 )
18
15
19
- pool = None
16
+ connection_pool = None
17
+
18
+ fortune_template = jinja2 .Environment (
19
+ loader = jinja2 .FileSystemLoader ('templates' ),
20
+ autoescape = True
21
+ ).get_template ('fortune.html' )
20
22
21
23
22
24
@Event .startup
23
- async def create_db_pool ():
24
- global pool
25
- pool = await asyncpg .create_pool (
25
+ async def on_startup ():
26
+ global connection_pool
27
+ connection_pool = await asyncpg .create_pool (
26
28
user = 'benchmarkdbuser' ,
27
29
password = 'benchmarkdbpass' ,
28
30
database = 'hello_world' ,
@@ -34,85 +36,70 @@ async def create_db_pool():
34
36
35
37
36
38
@Event .shutdown
37
- async def clean_db_pool ():
38
- await pool .close ()
39
-
40
-
41
- with Path ('templates/fortune.html' ).open () as f :
42
- fortune_template = jinja2 .Template (f .read ())
43
-
44
-
45
- def get_num_queries (request ):
46
- value = request .query_params .get ('queries' )
47
- if value is None :
48
- return 1
49
-
50
- try :
51
- query_count = int (value )
52
- except ValueError :
53
- return 1
54
- if query_count < 1 :
55
- return 1
56
- if query_count > 500 :
57
- return 500
58
- return query_count
39
+ async def on_shutdown ():
40
+ await connection_pool .close ()
59
41
60
42
61
43
@API ()
62
- async def json_serialization ():
44
+ def json_serialization ():
63
45
return Response (data = {'message' : 'Hello, world!' })
64
46
65
47
66
48
@API ()
67
49
async def single_database_query ():
68
50
row_id = randint (1 , 10000 )
69
- async with pool .acquire () as connection :
70
- number = await connection .fetchval (READ_ROW_SQL , row_id )
51
+ async with connection_pool .acquire () as connection :
52
+ number = await connection .fetchval ('SELECT id, randomnumber FROM world WHERE id = $1' , row_id )
71
53
return Response (data = {'id' : row_id , 'randomNumber' : number })
72
54
73
55
74
56
@API ()
75
57
async def multiple_database_queries (request : Request ):
76
- num_queries = get_num_queries (request )
77
- row_ids = sample (range (1 , 10000 ), num_queries )
78
-
79
- async with pool .acquire () as connection :
80
- statement = await connection .prepare (READ_ROW_SQL )
58
+ try :
59
+ count = int (request .query_params .get ('queries' , 1 ))
60
+ except (ValueError , TypeError ):
61
+ count = 1
62
+ row_ids = sample (range (1 , 10000 ), min (max (count , 1 ), 500 ))
63
+ async with connection_pool .acquire () as connection :
64
+ statement = await connection .prepare ('SELECT id, randomnumber FROM world WHERE id = $1' )
81
65
worlds = [{'id' : i , 'randomNumber' : await statement .fetchval (i )} for i in row_ids ]
82
-
83
66
return Response (data = worlds )
84
67
85
68
86
69
@API ()
87
70
async def fortunes ():
88
- async with pool .acquire () as connection :
71
+ async with connection_pool .acquire () as connection :
89
72
fortune_records = await connection .fetch ('SELECT * FROM Fortune' )
90
- fortune_records .append (ADDITIONAL_ROW )
73
+ fortune_records = [(row ['id' ], row ['message' ]) for row in fortune_records ]
74
+ fortune_records .append ((0 , 'Additional fortune added at request time.' ))
91
75
fortune_records .sort (key = lambda row : row [1 ])
92
76
data = fortune_template .render (fortunes = fortune_records )
93
77
return HTMLResponse (data = data )
94
78
95
79
96
80
@API ()
97
81
async def database_updates (request : Request ):
98
- num_queries = get_num_queries (request )
82
+ try :
83
+ count = int (request .query_params .get ('queries' , 1 ))
84
+ except (ValueError , TypeError ):
85
+ count = 1
86
+ num_queries = min (max (count , 1 ), 500 )
87
+
99
88
updates = list (zip (
100
89
sample (range (1 , 10000 ), num_queries ),
101
90
sorted (sample (range (1 , 10000 ), num_queries ))
102
91
))
103
-
104
92
worlds = [{'id' : row_id , 'randomNumber' : number } for row_id , number in updates ]
105
-
106
- async with pool .acquire () as connection :
107
- statement = await connection .prepare (READ_ROW_SQL )
93
+ async with connection_pool .acquire () as connection :
94
+ statement = await connection .prepare ('SELECT id, randomnumber FROM world WHERE id = $1' )
108
95
for _ , row_id in updates :
109
96
await statement .fetchval (row_id )
110
- await connection .executemany (WRITE_ROW_SQL , updates )
97
+ await connection .executemany ('UPDATE world SET randomnumber = $1 WHERE id = $2' , updates )
111
98
return Response (data = worlds )
112
99
113
100
114
101
@API ()
115
- async def plaintext ():
102
+ def plaintext ():
116
103
return PlainTextResponse (b'Hello, world!' )
117
104
118
105
0 commit comments