大概目前是这个情况,socket.io监听某个事件,回调函数是读取一个文件中的1024B,全部都用的是同一个 Buffer
var f1 = fs.openSync(path.join(path.dirname(__dirname), 'Advice.mp3'), 'r');
var bf1 = Buffer(1024);
socket.on('receive', function(msg){
fs.read(f1, bf1, 0, 1024, msg.index * 1024, function(err, bytesRead, data){
socket.emit('send_block', data);
});
});
这个receive事件会被频繁调用,可能20ms一次。之后我发现读几万个块,其中总有几个块的内容不对,就是说和原始文件中的不同,而其它的块则没有问题。我排查了很久才发现是这里出了问题,改成readSync之后,读到的块就都是对的了(当然我也知道用同步肯定是不合适的)。
我的问题有两个
- 为什么会有这种情况,写 buffer 并不是原子操作?
- 如果我不想每次都开一个新的 buffer,而是想尽可能重复利用一个 Buffer,又要异步读,有什么好办法吗?(之前试过random-access-file,也遇到一样的问题)
谢谢