Jelajahi Sumber

fastwsgi: Update asyncpg and using methods for async tasks (#9998)

Oleg S. 1 bulan lalu
induk
melakukan
3877be3881

+ 17 - 16
frameworks/Python/fastwsgi/app-asgi.py

@@ -17,6 +17,14 @@ except:
 
 db_pool = None
 
+PG_POOL_SIZE = 4
+
+class NoResetConnection(asyncpg.Connection):
+    __slots__ = ()
+
+    def get_reset_query(self):
+        return ""
+
 async def db_setup():
     global db_pool
     db_pool = await asyncpg.create_pool(
@@ -24,7 +32,10 @@ async def db_setup():
         password=os.getenv('PGPASS', 'benchmarkdbpass'),
         database='hello_world',
         host='tfb-database',
-        port=5432
+        port=5432,
+        min_size=PG_POOL_SIZE,
+        max_size=PG_POOL_SIZE,
+        connection_class=NoResetConnection,
     )
 
 READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
@@ -102,15 +113,10 @@ async def multiple_database_queries(scope, receive, send):
     row_ids = random.sample(range(1, 10000), num_queries)
     worlds = [ ]
 
-    db_conn = await db_pool.acquire()
-    try:
-        statement = await db_conn.prepare(READ_ROW_SQL)
-        for row_id in row_ids:
-            number = await statement.fetchval(row_id)
-            worlds.append( {'id': row_id, 'randomNumber': number} )
-    finally:
-        await db_pool.release(db_conn)
+    async with db_pool.acquire() as db_conn:
+        rows = await db_conn.fetchmany(READ_ROW_SQL, [ (v, ) for v in row_ids ] )
 
+    worlds = [ { 'id': row_id, 'randomNumber': number[0] } for row_id, number in zip(row_ids, rows) ]
     content = jsonify(worlds)
     await send(JSON_RESPONSE)
     await send({
@@ -154,14 +160,9 @@ async def database_updates(scope, receive, send):
     
     worlds = [ {"id": row_id, "randomNumber": number} for row_id, number in updates ]
 
-    db_conn = await db_pool.acquire()
-    try:
-        statement = await db_conn.prepare(READ_ROW_SQL)
-        for row_id, _ in updates:
-            await statement.fetchval(row_id)
+    async with db_pool.acquire() as db_conn:
+        await db_conn.executemany(READ_ROW_SQL, [ (i[0], ) for i in updates ] )
         await db_conn.executemany(WRITE_ROW_SQL, updates)
-    finally:
-        await db_pool.release(db_conn)
 
     content = jsonify(worlds)
     await send(JSON_RESPONSE)

+ 4 - 4
frameworks/Python/fastwsgi/requirements.txt

@@ -1,8 +1,8 @@
 click==8.0.1
-ujson==5.7.0
+ujson==5.10.0
 #fastwsgi==0.0.9
-git+https://github.com/jamesroberts/fastwsgi.git@5572bb31b859d690be225707b9e7e25af397544b
-asyncpg==0.27.0
-Jinja2==3.1.6
+git+https://github.com/jamesroberts/fastwsgi.git@eb6e60babab73e769f49c183cfc46bb270ca84bd
+asyncpg==0.30.0
+jinja2==3.1.6
 cachetools==5.3.0
 asyncache==0.3.1