0

我正在尝试使用限制为 10 个线程的工作线程来实现基本的矩阵乘法。但是不是工作线程的线程根本没有响应。矩阵 A 和 B 填充有随机数生成器。

if (isMainThread) {
    const M = 100;
    const N = 100;

    const matrixA = [];
    for (let i = 1; i <= M; i++) {
        // random numbers for each element of mat A
    }

    const matrixB = [];
    for (let i = 1; i <= M; i++) {
        // random numbers for each element of mat B
    }

    let matCCount = 0;
    const totalCount = (M * N);
    const matrixC = [];
    const time1 = new Date();

    let threadCount = 0;

    const calculateResult = (matrixC) => {
        const time2 = new Date();
        console.log(`\nTime taken: ${(time2 - time1) / 1000}s`);
    }

    const mainService = function(getResult) {
        for (let i = 0; i < M; i++) {
            for (let j = 0; j < N; j++) {
                let success = false;
                do {
                    if (threadCount < 11) {
                        const worker = new Worker(__filename, { workerData: { i, j, matrixA, matrixB } });
                        threadCount ++;
                        worker.on('message', (message) => {
                            getResult(message);
                            success = true;
                            threadCount --;
                        });
                        worker.on('online', () => { console.log('online'); })
                        worker.on('error', (err) => {
                            console.log(err);
                        });
                        worker.on('exit', (code) => { console.log(code); })
                    }
                } while (!success);
            }
        }
    }
    mainService((res) => {
        const { i, j, result } = res;
        if (matrixC[i] === undefined) {
            matrixC[i] = [];
        }
        matrixC[i][j] = result;
        matCCount += 1;
        if (matCCount === totalCount) {
            calculateResult(matrixC);
        }
    });
} else {
    const { i, j, matrixA, matrixB } = workerData;
    const x = multiplyOperation(i, j, matrixA, matrixB);
    parentPort.postMessage({ i, j, result: x, threadId });
}

既不会触发“在线”事件,也不会运行此 console.log

} else {
    console.log(threadId);
    const { i, j, matrixA, matrixB } = workerData;
    const x = multiplyOperation(i, j, matrixA, matrixB);
    parentPort.postMessage({ i, j, result: x, threadId });
}
4

0 回答 0