JS 有什么好用的的队列组件或者代码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
happy61
V2EX    问与答

JS 有什么好用的的队列组件或者代码?

  •  
  •   happy61 2022-10-13 14:01:42 +08:00 2381 次点击
    这是一个创建于 1172 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个需求,比如 设计一个队列,最高并发 2 个,我可以随时往队列放入任务,但是他只会同时执行 2 个,执行完毕后弹出队列,让下一个继续执行。 任务都是异步或者同步。

    16 条回复    2022-10-13 18:31:46 +08:00
    kop1989smurf
        1
    kop1989smurf  
       2022-10-13 14:06:41 +08:00
    没看明白楼主的需求。
    1 、并发数量可以逻辑管理,比如全局变量。
    2 、都是队列了,为何还会牵扯到同步任务……
    3 、“队列”你可以简单粗暴的理解为是 function 的数组。
    doommm
        2
    doommm  
       2022-10-13 14:10:40 +08:00
    看看这个? https://www.npmjs.com/package/queue
    或者用 rxjs 之类的做一套
    helone
        3
    helone  
       2022-10-13 14:11:26 +08:00
    。。。还是没太明白
    ChefIsAwesome
        4
    ChefIsAwesome  
       2022-10-13 14:27:48 +08:00
    rxjs 各种操作方法,做这种的多,以前写爬虫的时候用过。
    happy61
        5
    happy61  
    OP
       2022-10-13 14:35:38 +08:00
    @kop1989smurf 其实就是控制爬虫速度,避免过快。。大概可以这样理解。。要执行 100 条抓取任务,只运行 2 条同时运行
    wangmn
        6
    wangmn  
       2022-10-13 15:22:40 +08:00
    shakaraka
        7
    shakaraka  
    PRO
       2022-10-13 15:26:34 +08:00
    rxjs
    cvooc
        8
    cvooc  
       2022-10-13 15:28:24 +08:00
    async + await promise.all
    shakaraka
        10
    shakaraka  
    PRO
       2022-10-13 15:37:33 +08:00
    otakustay
        11
    otakustay  
       2022-10-13 15:51:32 +08:00
    p-queue 吧
    happyeveryday
        12
    happyeveryday  
       2022-10-13 16:05:04 +08:00
    @wunonglin rx 做这方面很好用
    duan602728596
        13
    duan602728596  
       2022-10-13 17:02:16 +08:00
    https://github.com/duan602728596/Q/blob/main/src/Queue.ts
    以前搞过限制文件上传,写过一个
    netnr
        14
    netnr  
       2022-10-13 17:51:16 +08:00 via Android
    说一下思路
    数组记录队列,尾部添加,取首并删除,这是队列
    任务处理,声明当前处理数量对象 C ,开始时,+1 ,任务结束时 -1 ,然后用 setInt.. 定时每 1000 毫秒包裹任务,添加判断,如果处理数对象 C<2 就执行任务处理,这是队列消费和执行任务
    收尾,队列空了 暂停 在任务处理中判断
    stein42
        15
    stein42  
       2022-10-13 18:30:34 +08:00
    /*
    典型的生产者消费者模型,限制并发的话只创建 2 个消费者就可以了。
    Queue 用于传送任务和同步。
    Queue 还可以优化,这里用 array 实现效率不高。
    Queue 还可以添加容量限制。
    */

    class Queue {
    #queue = [];
    #getter = [];

    put(x) {
    if (this.#getter.length > 0) {
    this.#getter.shift()(x);
    } else {
    this.#queue.push(x);
    }
    }

    get() {
    return new Promise(resolve => {
    if (this.#queue.length > 0) {
    resolve(this.#queue.shift());
    } else {
    this.#getter.push(resolve);
    }
    });
    }
    }

    function sleep(n) {
    return new Promise(resolve => {
    setTimeout(resolve, n);
    });
    }

    async function consumer(queue, id) {
    while (true) {
    const task = await queue.get();
    if (task === 'end') {
    console.log(`consumer ${id}, exit`);
    break;
    }
    console.log(`consumer ${id}, task ${task}, start`);
    await sleep(1000 * Math.random());
    console.log(`consumer ${id}, task ${task}, end`);
    }
    }

    async function producer(queue) {
    for (let i = 0; i < 10; i++) {
    console.log(`producer, task ${i}`);
    queue.put(i);
    }
    console.log(`producer, end`);
    queue.put('end');
    queue.put('end');
    }

    const q = new Queue();
    const c = [consumer(q, 0), consumer(q, 1)];
    const p = producer(q);
    Pipecraft
        16
    Pipecraft  
       2022-10-13 18:31:46 +08:00
    这个
    p-queue - https://github.com/sindresorhus/p-queue
    > Promise queue with concurrency control
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3434 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:52 PVG 08:52 LAX 16:52 JFK 19:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86