我有这样的 SQLAlchemy db.Model
:
def Action(db.Model):
__tablename__ = 'actions'
id = db.Column(db.Integer, primary_key=True)
status = db.Column(db.String(32), index=True)
def __init__(self, status):
self.status = status
def update(self):
# Code to update status (External query to API)
...
db.sesssion.commit()
现在我有一个类似的查询:
query = db.session.query(Action)
我想对此查询的所有元素执行update
方法。
以下效率非常低,因为每次调用update
需要2/3秒。
for a in query.all():
a.update()
如何对我的查询中的所有元素并行运行update
?
答案 0 :(得分:0)
我最终改变了我做事的方式,并在Action
模型周围放置了一个REST API。通过将PUT
发送到/api/action/{id}
端点来完成更新。
我的API客户端可以是异步的,以便并行执行请求。现在REST API本身是多处理的,并分布在多个实例上,SQLAlchemy
确保与数据库的连接是并发的。
客户端使用情况如下:
import MyApiClient
client = MyAPIClient('localhost:5001')
actions = client.get_actions()
ids = [a['id'] for a in actions]
for id in ids:
client.update_action(id, status='RUNNING', async=True)