在Ubuntu上使用Node.js进行并发编程,可以通过以下几种方式实现:
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);
});
const fs = require('fs').promises;
Promise.all([
fs.readFile('file1.txt', 'utf8'),
fs.readFile('file2.txt', 'utf8')
]).then(([data1, data2]) => {
console.log(data1);
console.log(data2);
}).catch(err => {
console.error(err);
});
async
关键字,可以在函数内部使用await
关键字等待Promise的结果。const fs = require('fs').promises;
async function readFiles() {
try {
const [data1, data2] = await Promise.all([
fs.readFile('file1.txt', 'utf8'),
fs.readFile('file2.txt', 'utf8')
]);
console.log(data1);
console.log(data2);
} catch (err) {
console.error(err);
}
}
readFiles();
events
模块创建一个事件发射器(EventEmitter),并在异步操作完成时触发事件。const EventEmitter = require('events');
const fs = require('fs');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('fileRead', (filename) => {
fs.readFile(filename, 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
});
myEmitter.emit('fileRead', 'file1.txt');
myEmitter.emit('fileRead', 'file2.txt');
cluster
模块允许在多个CPU内核上运行多个Node.js进程,从而实现真正的并行计算。const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
这些方法可以帮助你在Ubuntu上的Node.js应用程序中实现并发编程。你可以根据项目需求和个人喜好选择合适的方法。