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