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);