上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

js 队列限制并发

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5222

    回帖

    6094

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6094

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-9-25 14:53:03 | 显示全部楼层 | 阅读模式

    如我们需要执行100个任务,但是最大并发只允许五个
    为了限制同时执行的任务数
    可以使用https://www.npmjs.com/package/p-limit库
    首先创建一个限制函数,参数是需要限制的数量

    const limit = pLimit(1);

    然后调用limit传入一个函数即可,当不满足执行条件的时候不会执行
    允许Async/Promise函数

    limit(() => fetchSomething('foo'))

    其limit函数也会返回一个Promise,状态代表当前函数是否被执行完毕

    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也可以传入参数,为了解决闭包的问题

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    296

    主题

    3919

    回帖

    3841

    积分

    管理员

    积分
    3841

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-9-25 14:57:33 | 显示全部楼层
    js不是单线程么,限制干啥
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5222

    回帖

    6094

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6094

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-9-25 15:57:00 | 显示全部楼层
    王一之 发表于 2023-9-25 14:57
    js不是单线程么,限制干啥

    比如我要跑500个下载任务,如果同时发网络包,会你下一块我下一块
    这样限制住,最大三个,就优先下载完这三个再下其他的
    提高容错性
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    10 小时前
  • 签到天数: 641 天

    [LV.9]以坛为家II

    30

    主题

    536

    回帖

    1414

    积分

    荣誉开发者

    积分
    1414

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2023-9-25 15:59:52 | 显示全部楼层
    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);
                    });
            }
        });
    };

    手撸了一个迸发限制

    image.png

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5222

    回帖

    6094

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6094

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-9-25 16:17:40 | 显示全部楼层
    steven026 发表于 2023-9-25 15:59
    [md]```js
    const Surge = (limit, total) => {
        return new Promise((allDone) => {

    6!我都是有啥先去查查库
    能install绝不手写
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    10 小时前
  • 签到天数: 641 天

    [LV.9]以坛为家II

    30

    主题

    536

    回帖

    1414

    积分

    荣誉开发者

    积分
    1414

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2023-9-25 16:19:59 | 显示全部楼层

    李恒道 发表于 2023-9-25 16:17

    6!我都是有啥先去查查库
    能install绝不手写

    我如果能自己实现绝不require import
    e4b1c93d25c8c10acca0577266d279e8.jpg

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    296

    主题

    3919

    回帖

    3841

    积分

    管理员

    积分
    3841

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-9-25 16:32:02 | 显示全部楼层
    李恒道 发表于 2023-9-25 15:57
    比如我要跑500个下载任务,如果同时发网络包,会你下一块我下一块
    这样限制住,最大三个,就优先下载完这 ...

    有道理
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    296

    主题

    3919

    回帖

    3841

    积分

    管理员

    积分
    3841

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-9-25 16:32:56 | 显示全部楼层
    李恒道 发表于 2023-9-25 16:17
    6!我都是有啥先去查查库
    能install绝不手写

    我也是
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表