Python 3.6 Flask Restful 和异步 for 循环

问题描述 投票:0回答:1

因此,我使用 Sqlalchemy 配置了 Flask Restful,它从数据库返回数据,并且我想异步处理返回数据的函数调用。

示例

def doSomething(id):
 doing tasks and updating to db


Class XYZ(Resource):
 def get():
  getId = dbgetIds()
  for ids in getId:
   doSomething(ids)

我想让 for 循环异步调用该函数,因为每次调用都需要花费大量时间,并且当它到达列表末尾时,它准备再次更新。有人可以帮忙吗?

python-3.x asynchronous sqlalchemy flask-restful
1个回答
0
投票

您可以使用Python的asyncio库和asyncpg来进行异步数据库操作。这种方法允许您同时运行多个任务,从而提高应用程序的性能。

import asyncio
import asyncpg
import time

async def doSomething(id):
    await asyncio.sleep(2)
    conn = await asyncpg.connect(user='postgres', password='kartyk', database='test_db', host='localhost')
    await conn.execute('UPDATE user_data SET password = \'changed\' WHERE user_id = $1', id)
    await conn.close()

class XYZ:
    async def get(self):
        conn = await asyncpg.connect(user='postgres', password='kartyk', database='test_db', host='localhost')
        users = await conn.fetch('SELECT * FROM user_data')
        await conn.close()

        tasks = [doSomething(user['user_id']) for user in users]
        await asyncio.gather(*tasks)

        return {'status': 'success'}

async def main():
    start = time.perf_counter()
    xyz = XYZ()
    result = await xyz.get()
    print(result)
    end = time.perf_counter()
    
    print(f"Time taken: {end - start} seconds")

if __name__ == "__main__":
    asyncio.run(main())

© www.soinside.com 2019 - 2024. All rights reserved.