| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | import multiprocessingfrom random import randint, sampleimport asyncpgimport jinja2from panther import Pantherfrom panther.app import APIfrom panther.events import Eventfrom panther.request import Requestfrom panther.response import Response, PlainTextResponse, HTMLResponsecpu_count = multiprocessing.cpu_count()MAX_POOL_SIZE = 1000 // cpu_countMIN_POOL_SIZE = max(MAX_POOL_SIZE // 2, 1)connection_pool = Nonefortune_template = jinja2.Environment(    loader=jinja2.FileSystemLoader('templates'),    autoescape=True).get_template('fortune.html')@Event.startupasync def on_startup():    global connection_pool    connection_pool = await asyncpg.create_pool(        user='benchmarkdbuser',        password='benchmarkdbpass',        database='hello_world',        host='tfb-database',        port=5432,        min_size=MIN_POOL_SIZE,        max_size=MAX_POOL_SIZE,    )@Event.shutdownasync def on_shutdown():    await connection_pool.close()@API()def json_serialization():    return Response(data={'message': 'Hello, world!'})@API()async def single_database_query():    row_id = randint(1, 10000)    async with connection_pool.acquire() as connection:        number = await connection.fetchval('SELECT id, randomnumber FROM world WHERE id = $1', row_id)    return Response(data={'id': row_id, 'randomNumber': number})@API()async def multiple_database_queries(request: Request):    try:        count = int(request.query_params.get('queries', 1))    except (ValueError, TypeError):        count = 1    row_ids = sample(range(1, 10000), min(max(count, 1), 500))    async with connection_pool.acquire() as connection:        statement = await connection.prepare('SELECT id, randomnumber FROM world WHERE id = $1')        worlds = [{'id': i, 'randomNumber': await statement.fetchval(i)} for i in row_ids]    return Response(data=worlds)@API()async def fortunes():    async with connection_pool.acquire() as connection:        fortune_records = await connection.fetch('SELECT * FROM Fortune')    fortune_records = [(row['id'], row['message']) for row in fortune_records]    fortune_records.append((0, 'Additional fortune added at request time.'))    fortune_records.sort(key=lambda row: row[1])    data = fortune_template.render(fortunes=fortune_records)    return HTMLResponse(data=data)@API()async def database_updates(request: Request):    try:        count = int(request.query_params.get('queries', 1))    except (ValueError, TypeError):        count = 1    num_queries = min(max(count, 1), 500)    updates = list(zip(        sample(range(1, 10000), num_queries),        sorted(sample(range(1, 10000), num_queries))    ))    worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates]    async with connection_pool.acquire() as connection:        statement = await connection.prepare('SELECT id, randomnumber FROM world WHERE id = $1')        for _, row_id in updates:            await statement.fetchval(row_id)        await connection.executemany('UPDATE world SET randomnumber = $1 WHERE id = $2', updates)    return Response(data=worlds)@API()def plaintext():    return PlainTextResponse(b'Hello, world!')url_routing = {    'json': json_serialization,    'db': single_database_query,    'queries': multiple_database_queries,    'fortunes': fortunes,    'updates': database_updates,    'plaintext': plaintext,}app = Panther(__name__, configs=__name__, urls=url_routing)
 |