【发布时间】:2017-04-27 16:18:23
【问题描述】:
任务是:
- 集群创建工人
- 每个worker逐行加载一些远程数据并输出到自己的process.stdout
- 整个集群的输出被重定向到文件
预期结果:所有工作人员的所有行都连接到结果文件
实际结果:在某些机器上结果如预期,在其他机器上结果是交错的。
在 Ubuntu OS 下的 0.10.47 和 0.12.7 节点上测试。在 Ubuntu 16.04.2 下的两台机器上,结果很好。在Ubuntu 14.04.5下是隔行扫描的。
我需要帮助来了解这种情况并在 14.04 修复它。
cluster.js:
var cluster = require("cluster");
cluster.setupMaster({
exec: "./worker.js"
});
cluster.fork();
cluster.fork();
worker.js:
var cluster = require("cluster");
var fs = require("fs");
var workerId = cluster.worker && cluster.worker.id || 1;
var stream = fs.createReadStream("./data" + workerId + ".log");
stream.on("end", function () {
process.exit();
});
stream.pipe(process.stdout);
您需要在同一个文件夹中名为 data1.log 和 data2.log 的两个文件来读取数据:
$ wc -l data*
9260 data1.log
111636 data2.log
120896 total
管道总是能产生良好的效果:
$ node cluster.js | wc -l
120896
重定向到文件只在 Ubuntu 16.04 上提供了良好的结果,但在 Ubuntu 14.04 上却没有。甚至在 Ubuntu 14.04 上它每次都会给出不同的结果:
$ node cluster.js >result.log; wc -l result.log
114135 <= MUST BE 120896
$ node cluster.js >result.log; wc -l result.log
110136 <= MUST BE 120896
重定向到文件以进行添加总是会产生良好的结果:
$ rm result.log
$ node cluster.js >>result.log; wc -l result.log
120896
请注意,生成的文件小于原始文件。它的行数更少,字节数更少。所以我认为来自不同工作人员的线路正在相互重写。
【问题讨论】:
标签: node.js ubuntu redirect cluster-computing stdout