typeorm promise.all 与等待搜索
typeorm promise.all vs await for search
我在学习中发现promise.all可以加快数据库搜索速度。
我通过三个函数进行搜索。
许多table是由join组成的,有时查找相同的table
async methodA(){
const [result1, result2] = await promise.all([
this.Arepository.find({relation:[...],where:{...}},
this.Brepository.find({relation:[...],where:{...}})
]);
for(const r of result1){
r.user = await this.usersRepository.findOne({id:r.user_id}}
}
return ...
}
async methodB(){
const [result1, result2] = await promise.all([
this.Brepository.find({relation:[...],where:{...}},
this.Crepository.find({relation:[...],where:{...}})
]);
for(const r of result1){
r.user = await this.usersRepository.findOne({id:r.user_id}}
}
return ...
}
async methodC(){
const [result1, result2] = await promise.all([
this.Arepository.find({relation:[...],where:{...}},
this.Crepository.find({relation:[...],where:{...}})
]);
for(const r of result1){
r.user = await this.usersRepository.findOne({id:r.user_id}}
}
return ...
}
代码如上所写。
如果我在控制器里运行下面的代码,会不会影响速度?
const [a,b,c] = await Promise.all([
this.service.methodA(),
this.service.methodB(),
this.service.methodC()]);
目前,在我的代码中,
1秒如果promise.all不存在,
0.8-0.9秒,如果有。
很难确定这是否有任何其他影响。
于是我去搜索了一下,结果还是模棱两可的答案。
我想知道在这种情况下速度是否可以更快一点,即使查找相同 table.
期待您的回复。谢谢。
理论上应该更快。但是,我们不能忘记 TypeOrm
的最大默认连接池为 10,这意味着如果 methodA
创建 10 个连接,其他方法将不得不等待它们完成。如果 methodB
有打开的请求也是如此 - 这将阻止 methodC
中的请求等等。在这些场景中,父(最后一个)示例中的代码确实更加同步,但仍然应该有加速。
我是针对异步调用一般性地回答这个问题,应该也适用于您的情况。
如果您选择使用 promise 链或 await
,您实际上是在等待某些操作完成,然后才继续。但是当你使用 promise.all()
或 promise.allSettled()
之类的东西时,这意味着你没有等待任何特定的操作,这与 并行启动所有这些操作一样好 。很容易得出结论,使用 promise.all
或 promise.allSettled()
几乎在所有情况下都能提高执行速度。
然而,是否使用它在很大程度上取决于您的应用程序。如果你有异步调用,它们之间存在依赖关系,你最好使用 promise 链或 await
,否则你可以使用其他的。
我在学习中发现promise.all可以加快数据库搜索速度。
我通过三个函数进行搜索。 许多table是由join组成的,有时查找相同的table
async methodA(){
const [result1, result2] = await promise.all([
this.Arepository.find({relation:[...],where:{...}},
this.Brepository.find({relation:[...],where:{...}})
]);
for(const r of result1){
r.user = await this.usersRepository.findOne({id:r.user_id}}
}
return ...
}
async methodB(){
const [result1, result2] = await promise.all([
this.Brepository.find({relation:[...],where:{...}},
this.Crepository.find({relation:[...],where:{...}})
]);
for(const r of result1){
r.user = await this.usersRepository.findOne({id:r.user_id}}
}
return ...
}
async methodC(){
const [result1, result2] = await promise.all([
this.Arepository.find({relation:[...],where:{...}},
this.Crepository.find({relation:[...],where:{...}})
]);
for(const r of result1){
r.user = await this.usersRepository.findOne({id:r.user_id}}
}
return ...
}
代码如上所写。 如果我在控制器里运行下面的代码,会不会影响速度?
const [a,b,c] = await Promise.all([
this.service.methodA(),
this.service.methodB(),
this.service.methodC()]);
目前,在我的代码中, 1秒如果promise.all不存在, 0.8-0.9秒,如果有。
很难确定这是否有任何其他影响。
于是我去搜索了一下,结果还是模棱两可的答案。 我想知道在这种情况下速度是否可以更快一点,即使查找相同 table.
期待您的回复。谢谢。
理论上应该更快。但是,我们不能忘记 TypeOrm
的最大默认连接池为 10,这意味着如果 methodA
创建 10 个连接,其他方法将不得不等待它们完成。如果 methodB
有打开的请求也是如此 - 这将阻止 methodC
中的请求等等。在这些场景中,父(最后一个)示例中的代码确实更加同步,但仍然应该有加速。
我是针对异步调用一般性地回答这个问题,应该也适用于您的情况。
如果您选择使用 promise 链或 await
,您实际上是在等待某些操作完成,然后才继续。但是当你使用 promise.all()
或 promise.allSettled()
之类的东西时,这意味着你没有等待任何特定的操作,这与 并行启动所有这些操作一样好 。很容易得出结论,使用 promise.all
或 promise.allSettled()
几乎在所有情况下都能提高执行速度。
然而,是否使用它在很大程度上取决于您的应用程序。如果你有异步调用,它们之间存在依赖关系,你最好使用 promise 链或 await
,否则你可以使用其他的。