如何使用socket.io处理节点服务器上的并发文件写入请求。我用这写:如何使用socket.io处理节点服务器上的并发文件写入请求
fs.writefile('abc.txt','datatobewritten','utf8',function(err){});
我有一个将文件abc.txt,并假设两个用户试图在同一时间对这个文件,然后我得到一个错误写,让我怎么排队多个请求。
如何使用socket.io处理节点服务器上的并发文件写入请求。我用这写:如何使用socket.io处理节点服务器上的并发文件写入请求
fs.writefile('abc.txt','datatobewritten','utf8',function(err){});
我有一个将文件abc.txt,并假设两个用户试图在同一时间对这个文件,然后我得到一个错误写,让我怎么排队多个请求。
你应该写一个模块名称logs
或你喜欢什么。
logs.js
var fs = require('fs');
var writeStream = fs.createWriteStream('./abc.txt');
module.exports = {
/* PUSH */
write: function (message, cb) {
writeStream.write(message, cb);
}
}
然后你socket.io相关模块中只需要在上面像
var logs = require('./logs');
模块,并像这样在写消息socket.io回调! :)
logs.write('datatobewritten');
底线 “使用
fs.createWriteStream
代替fs.writefile
”
希望这是有道理:)
你必须写操作同步。
对于你的NodeJS可以使用简单的队列,像这样一个实例:
module.exports = function(path, content, cb){
var queue = queues[path];
if (queue == null)
queue = queues[path] = new Queue;
queue.add(path, content, (err) => {
cb(err);
queue.next();
});
};
var fs = require('fs');
var queues = {};
class Queue {
constructor() {
this.queue = [];
}
next() {
if (this.queue.length === 0)
return;
var [path, content, cb] = this.queue[0];
fs.writeFile(path, content, 'utf8', (err) => {
this.queue.unshift();
cb(err);
});
}
add (...args) {
this.queue.push(...args);
if (this.queue.length === 1) {
this.next();
}
}
}
在多进程情况下,你必须使用一些锁定,例如与lockfile。
var lockFile = require('lockfile');
var fs = require('fs');
module.exports = function(path, content, cb) {
lockFile.lock('foo.lock', function (err) {
if (err) return cb(err);
fs.writeFile(path, content, cb);
lockFile.unlock('foo.lock');
});
}
为了获得更好的性能,你甚至可以在这里结合2点的方法。
我有多个进程写入文件,我将如何结合这两种方法? – chovy
尝试写同步方法 –