同时运行代码
为了更快地执行执行,我们通常同时运行代码。
在JavaScript中同时运行代码的一种方法是同时致电许多诺言,而无需等待其结果,然后您使用Promise.all
等待所有承诺完成的承诺。检查下面的示例:
const promiseA = asyncFnA();
const promiseB = asyncFnB();
const results = await Promise.all([promiseA, promiseB]);
上面的代码将同时执行asyncFnA
和asyncFnB
,Promise.all
将等待两个执行以解决。
同时实现许多诺言
让我们看一下此代码
const users = await User.find(); // return all users in the database
const results = await Promise.all(users.map(async (user) => processUser(user));
此代码将在数据库中运行与users
一样多的承诺。节点和JavaScript并不能很好地处理许多同时运行的承诺,因此可以很好地处理。
此代码可能会消耗大量的CPU和内存,并且会用尽内存。
为了解决这个问题,我们需要在批处理中处理所有这些承诺
处理承诺分批
export async function processPromisesBatch(
items: Array<any>,
limit: number,
fn: (item: any) => Promise<any>,
): Promise<any> {
let results = [];
for (let start = 0; start < items.length; start += limit) {
const end = start + limit > items.length ? items.length : start + limit;
const slicedResults = await Promise.all(items.slice(start, end).map(fn));
results = [
...results,
...slicedResults,
]
}
return results;
}
用法
const results = await processPromisesBatch(users, 100, processUser)
processPromisesBatch
会将您的物品切成n大小为n的块,并同时执行n承诺。
这样可以确保它不会消耗大量的CPU和内存,并用尽事件循环。
综上所述
了解您的编程语言和运行时的局限性,可以帮助您设计解决方案以解决方案。
共享基于编程语言,运行时或框架的限制设计的解决方案。
woi
Woovi是一家创业公司,使购物者能够按照自己的意愿付款。为了实现这一目标,Woovi为商人提供即时付款解决方案接受订单。
如果您想与我们合作,我们是hiring!
照片