在Ubuntu环境下,使用JavaScript实现并发可以通过多种方式来完成。以下是一些常见的方法:
const fs = require('fs');
// 异步读取文件
fs.readFile('file1.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.readFile('file2.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 主线程继续执行其他任务
console.log('Files are being read concurrently.');
const fs = require('fs').promises;
async function readFiles() {
try {
const data1 = await fs.readFile('file1.txt', 'utf8');
console.log(data1);
const data2 = await fs.readFile('file2.txt', 'utf8');
console.log(data2);
} catch (err) {
console.error(err);
}
}
readFiles();
console.log('Files are being read concurrently.');
worker_threads
模块允许你在单独的线程中运行JavaScript代码,这样可以实现真正的并行计算。const { Worker } = require('worker_threads');
function runWorker(workerData) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
}
if (require.main === module) {
// 主线程代码
runWorker({ message: 'Hello from main thread!' }).then(console.log);
} else {
// Worker线程代码
const { workerData } = require('worker_threads');
console.log(workerData.message);
process.send('Message from worker thread!');
}
child_process
模块可以用来创建子进程,这些子进程可以并行运行,并且可以与主进程通信。const { spawn } = require('child_process');
const child1 = spawn('node', ['child.js']);
const child2 = spawn('node', ['child.js']);
child1.stdout.on('data', (data) => {
console.log(`Child 1 output: ${data}`);
});
child2.stdout.on('data', (data) => {
console.log(`Child 2 output: ${data}`);
});
child1.stderr.on('data', (data) => {
console.error(`Child 1 error: ${data}`);
});
child2.stderr.on('data', (data) => {
console.error(`Child 2 error: ${data}`);
});
在child.js
中,你可以编写子进程要执行的代码。
这些方法可以帮助你在Ubuntu环境下使用JavaScript实现并发。选择哪种方法取决于你的具体需求和应用场景。