我希望能够实现以下事件序列:
我理解原子写入的价值,但是否有任何建议来
1. locking a file
2. reading from it
3. writing to it
4. releasing the lock
我们如何使用Node.js来实现这个功能?假设该文件存储着简单的JSON数据。
我希望能够实现以下事件序列:
我理解原子写入的价值,但是否有任何建议来
1. locking a file
2. reading from it
3. writing to it
4. releasing the lock
您必须确保“原子锁”。从内部节点,您可以使用符号链接来实现此目的。这是一个简单计数器的示例:
const fs = require('fs');
// the lock function must be a recursive timer
const flock = (file_name, resolve, reject) => {
fs.symlink(file_name, 'locked_' + file_name, (err) => {
if(err)
if(err.code == 'EEXIST')
setTimeout(() => {
flock(file_name, resolve, reject)
}, 13);
else
reject(err);
else
resolve();
});
}
const counter_increment = async () => {
file_name = 'counter.txt';
// Lock file
await new Promise((resolve, reject) => {
flock(file_name, resolve, reject);
});
// Read file
let count = await new Promise((resolve, reject) => {
fs.readFile(file_name, 'utf8', (err, data) => {
if (err) resolve(0);
resolve(parseInt(data));
});
});
// Write file
await new Promise((resolve, reject) => {
fs.writeFile(file_name,"" + ++count + " ", (err) => {
if (err) reject(err);
resolve();
});
});
// Unlock file
fs.unlink('locked_' + file_name, (err) => {
if (err) console.error(err);
});
return count;
};
counter_increment();