js 队列限制并发
如我们需要执行100个任务,但是最大并发只允许五个为了限制同时执行的任务数
可以使用https://www.npmjs.com/package/p-limit库
首先创建一个限制函数,参数是需要限制的数量
```js
const limit = pLimit(1);
```
然后调用limit传入一个函数即可,当不满足执行条件的时候不会执行
允许Async/Promise函数
```js
limit(() => fetchSomething('foo'))
```
其limit函数也会返回一个Promise,状态代表当前函数是否被执行完毕
```js
const input = [
limit(() => fetchSomething('foo')),
limit(() => fetchSomething('bar')),
limit(() => doSomething())
];
// Only one promise is run at once
const result = await Promise.all(input);
console.log(result);
```
# 属性值
activeCount:表示当前正在运行的任务数量
pendingCount:表示当前等待运行的任务数量
clearQueue()丢弃等待运行的队列
# Tips
limit(fn, ...args)
limit也可以传入参数,为了解决闭包的问题 js不是单线程么,限制干啥 王一之 发表于 2023-9-25 14:57
js不是单线程么,限制干啥
比如我要跑500个下载任务,如果同时发网络包,会你下一块我下一块
这样限制住,最大三个,就优先下载完这三个再下其他的
提高容错性 ```js
const Surge = (limit, total) => {
return new Promise((allDone) => {
const Queue = Array(total)
.fill()
.map((i, index) => CreateRandomPromise(index));
console.log('队列总计' + total, '队列限制' + limit);
let inProgress = 0;
for (let i = 0; i < limit; i++) {
inProgress++;
Queue.shift()();
}
function Check(index, delay) {
const left = Queue.length;
inProgress--;
console.log('队列' + index + '运行完毕', '随机延迟' + delay, '队列剩余' + left);
if (left > 0) {
inProgress++;
Queue.shift()();
}
if (inProgress == 0 && left == 0) {
console.log('队列完毕allDone');
allDone('allDone');
}
}
function CreateRandomPromise(index) {
return () =>
new Promise((resolve) => {
const delay = Math.random() * 3000;
setTimeout(() => {
Check(index, delay);
resolve();
}, delay);
});
}
});
};
```
手撸了一个迸发限制
![](https://bbs.tampermonkey.net.cn/data/attachment/forum/202303/27/091559h4pubz916zb8dduz.jpg)
!(data/attachment/forum/202309/25/155937p0l602eg0ql4stl9.png) steven026 发表于 2023-9-25 15:59
```js
const Surge = (limit, total) => {
return new Promise((allDone) => {
6!我都是有啥先去查查库
能install绝不手写 李恒道 发表于 2023-9-25 16:17
6!我都是有啥先去查查库
能install绝不手写
我如果能自己实现绝不require import
!(data/attachment/forum/202309/25/161953bgj2vmm8g2umf102.jpg) 李恒道 发表于 2023-9-25 15:57
比如我要跑500个下载任务,如果同时发网络包,会你下一块我下一块
这样限制住,最大三个,就优先下载完这 ...
有道理 李恒道 发表于 2023-9-25 16:17
6!我都是有啥先去查查库
能install绝不手写
我也是
页:
[1]