gpt4 book ai didi

javascript - Node.js:使用顺序+异步输入/输出的并行处理

转载 作者:搜寻专家 更新时间:2023-11-01 00:50:05 25 4
gpt4 key购买 nike

我正在尝试在 Node.js 中为可能包含数万个项目的数组构建一个高效的异步处理管道。管道从调用 Web API(使用 node-fetch 包)开始,经过多个解析/转换步骤,然后以附加到磁盘上的文件结束。

但是,将一些要求放在一起证明会使这变得困难:

  1. Web API 每分钟允许的请求数量有限,因此我必须能够限制/设置每次初始 fetch 调用之间的延迟。这意味着这个阶段必须是异步顺序的。

  2. 所有结果都写入同一个文件,并且必须按照初始数组指定的相同顺序追加,因此这个阶段也必须是顺序的。

  3. 否则,为了一般性能,事情应该尽可能并行运行。示例:

    一个。应该能够处理较早的项目,包括文件写入步骤(假设满足要求 2),同时尚未获取较晚的项目(由于第 1 点的限制)。

    后面的项目应该只在最后的文件写入步骤被前面的项目延迟(例如,如果一个有特别大的 API 响应主体或特别长的解析时间)(为了满足要求 2)。中间步骤的项目之间不应存在顺序依赖性。

应该注意的是,我使用的是 Node 10,所以我确实有可用的异步迭代器/for await。我最接近的尝试看起来像这样(假装它在异步函数上下文中):

const valuePromises = [];

const delaySequence = itemArray.reduce(async (sequence, item) => {
await sequence;
const valuePromise = fetch(item.url)
.then(step1)
.then(step2)
.then(step3);
valuePromises.push(valuePromise);
return sleep(1000); // promisified setTimeout
}, Promise.resolve());

// If I don't do this the valuePromises array won't be fully populated:
await delaySequence;

for await (const value of valuePromises) {
await appendToFile(value);
}

除了它违反了上面的“a”点之外,这是可行的,因为它必须等到所有提取都被触发,然后才能开始附加到文件。

我试过使用异步生成器,但没能想出更好的办法。

我考虑过使用流,它似乎适合这种任务;他们将解决顺序问题(先进先出)并允许一定程度的并行性。然而,它们有一个限制,即一个项目不能在较早的项目之前通过管道中的中间阶段,这违反了“b”。我也不知道让流与基于 promise 的 API 交互有多容易。

有人知道如何实现吗?

最佳答案

我认为这会做你想做的事......“appendToFile”序列的一个单独的 Promise“链”

let writeSequence = Promise.resolve();

const delaySequence = itemArray.reduce(async (sequence, item) => {
await sequence;
const valuePromise = fetch(item.url)
.then(step1)
.then(step2)
.then(step3);
writeSequence = writeSequence.then(() => valuePromise.then(appendToFile));
return sleep(1000); // promisified setTimeout
}, Promise.resolve());

抱歉,里面有一个无效的 await - 现在不见了

关于javascript - Node.js:使用顺序+异步输入/输出的并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com