結果突然出現。我放了三個控制臺。第一個作業正常。其余的突然出現在最后。
我希望它在達到 200000000 時顯示,然后在達到 300000000 時顯示。但是現在程式結束時突然出現 200000000 和 300000000
'use strict';
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
let primes = [];
const mystring = 1 ;
function generatePrimes(mystr, range) {
for (let i = 0; i < 1000000000; i ) {
if (i===100000000){
console.log(i);
}
if (i==200000000){
console.log(i);
}
if (i==300000000){
console.log(i);
}
mystr
}
}
if (isMainThread) {
const threadCount =2;
const threads = new Set();;
console.log(`Running with ${threadCount} threads...`);
const range = Math.ceil((max - min) / threadCount);
let start = min;
for (let i = 0; i < threadCount ; i ) {
threads.add(new Worker(__filename, { workerData: { start: mystring, range }}));
start = range;
}
// threads.add(new Worker(__filename, { workerData: { start, range: range ((max - min 1) % threadCount)}}));
for (let worker of threads) {
worker.on('error', (err) => { throw err; });
worker.on('exit', () => {
threads.delete(worker);
console.log(`Thread exiting, ${threads.size} running...`);
if (threads.size === 0) {
console.log(primes.join('\n'));
}
})
worker.on('message', (msg) => {
primes = primes.concat(msg);
});
}
} else {
generatePrimes(workerData.start, workerData.range);
parentPort.postMessage(primes);
}
uj5u.com熱心網友回復:
在檔案中有這個 -> https://nodejs.org/api/worker_threads.html#synchronous-blocking-of-stdio
我可以想到兩種解決方案。
從作業執行緒向主執行緒發送訊息并從那里記錄。
使素數函式異步,并在那里放一些異步的東西,例如。設定超時。這允許作業執行緒訊息泵繼續運行并允許主執行緒控制臺繼續..
以下是修改后的代碼以使用選項 1。
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
const max = 2;
let primes = [];
const mystring = 1 ;
async function generatePrimes(mystr, range) {
for (let i = 0; i < 1000000000; i ) {
if (i===100000000){
parentPort.postMessage({log: i}); }
if (i==200000000){
parentPort.postMessage({log: i});
}
if (i==300000000){
parentPort.postMessage({log: i}); }
mystr
}
}
if (isMainThread) {
const threadCount =2;
const threads = new Set();;
console.log(`Running with ${threadCount} threads...`);
const range = Math.ceil((max - min) / threadCount);
let start = min;
for (let i = 0; i < threadCount ; i ) {
threads.add(new Worker(__filename, { workerData: { start: mystring, range }}));
start = range;
}
// threads.add(new Worker(__filename, { workerData: { start, range: range ((max - min 1) % threadCount)}}));
for (let worker of threads) {
worker.on('error', (err) => { throw err; });
worker.on('exit', () => {
threads.delete(worker);
console.log(`Thread exiting, ${threads.size} running...`);
if (threads.size === 0) {
console.log(primes.join('\n'));
}
})
worker.on('message', (msg) => {
if (msg.log) console.log(msg.log)
else if (msg.primes) primes = primes.concat(msg.primes);
});
}
} else {
generatePrimes(workerData.start, workerData.range);
parentPort.postMessage({primes});
}
下面是修改后的代碼以使用選項 2。
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
const max = 2;
let primes = [];
const mystring = 1 ;
const sleep = ms => new Promise(r => setTimeout(r, ms));
async function generatePrimes(mystr, range) {
for (let i = 0; i < 1000000000; i ) {
if (i===100000000){
console.log(i);
await sleep(1);
}
if (i==200000000){
console.log(i);
await sleep(1);
}
if (i==300000000){
console.log(i);
await sleep(1);
}
mystr
}
}
if (isMainThread) {
const threadCount =2;
const threads = new Set();;
console.log(`Running with ${threadCount} threads...`);
const range = Math.ceil((max - min) / threadCount);
let start = min;
for (let i = 0; i < threadCount ; i ) {
threads.add(new Worker(__filename, { workerData: { start: mystring, range }}));
start = range;
}
// threads.add(new Worker(__filename, { workerData: { start, range: range ((max - min 1) % threadCount)}}));
for (let worker of threads) {
worker.on('error', (err) => { throw err; });
worker.on('exit', () => {
threads.delete(worker);
console.log(`Thread exiting, ${threads.size} running...`);
if (threads.size === 0) {
console.log(primes.join('\n'));
}
})
worker.on('message', (msg) => {
primes = primes.concat(msg);
});
}
} else {
generatePrimes(workerData.start, workerData.range);
parentPort.postMessage(primes);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366707.html
標籤:javascript 节点.js 多线程
