在尝试理解事件循环时,我写了一个快速片段来测试我的假设。毫不奇怪,他们错了!
import fs from 'fs'
let bufferA = new Buffer(1e+9)
bufferA.fill(0)
let bufferB = new Buffer(1e+0)
bufferB.fill(0)
let fileA = fs.openSync('fileA', 'w')
let fileB = fs.openSync('fileB', 'w')
fs.write(fileA, bufferA, 0, bufferA.length, (err) => { console.log(err || 'wroteA')})
console.log('Started writing to A..')
fs.write(fileB, bufferB, 0, bufferB.length, (err) => { console.log(err || 'wroteB')})
console.log('Started writing to B..')
我希望两个文件都是异步写入的(即fileB先完成),但输出如下:
Started writing to A..
Started writing to B..
wroteA
wroteB
显示wroteA
之前的延迟。因此,虽然fs.write
似乎与我的代码异步操作(即,首先写入日志),但似乎一次只能写一个文件?
答案 0 :(得分:1)
每Ben Noordhuis on the GitHub issue you opened for this:
Libuv序列化OS X上的磁盘写入,因为记录了一个令人讨厌的怪癖here。可能更新的OS X版本更好,但尚未经过测试。
Node.js将libuv用于文件I / O之类的东西。所以...它是序列化的,但(至关重要的是)不会阻止事件循环。所以fileA可能阻止写入fileB,但不是所有其他JS的东西。仅限OS X.