用JS生成器函数(协程)模拟并发

231 阅读1分钟

用JS生成器函数(协程)模拟一个简单的销售票务的并发系统。

let TICKET_NUM = 0;
let TICKET_TOTAL = 0;

function* sale(name){
    const saleName = name;
    while (true) {
        if ( TICKET_NUM <= 0 ) {
            console.log(`${saleName} => No ticket`);
            return;
        }else {
            TICKET_TOTAL++;
            console.log(`${saleName} => sales the No.${TICKET_TOTAL} ticket`);
            TICKET_NUM--;
        }
        yield;
    }
}

let thread = async() => {
    let pool = [sale("A"), sale("B"), sale("C"), sale("D")];
    let len = pool.length;
    let moniter = len;
    TICKET_NUM = 2000;
    while( true ) {
        let id = parseInt( Math.random() * len );
        let status = pool[id].next().done;
        if ( status ) moniter--;
        if ( moniter == 0 ) {
            console.log("All tickets saled done...");
            break;
        }
    }
}

thread();