2015-11-01 64 views
-3

在试图理解事件循环时,我写了一个快速片段来测试我的假设。毫不奇怪,他们错了!异步写入多个文件

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

所以,你的问题留给读者自己想一想,但你是否说你感到惊讶,fileB并没有先完成,因为写入它的字节数是如此之多较小(1GB vs 1个字节)?这个问题是关于什么的? – jfriend00

+0

在我的系统中,我收到'writesB',就像我期望的那样,在'writesA'之前显示了很久。什么版本的node.js和你在哪个操作系统上运行?我在Windows 10上运行节点v0.12.2。我无法重现你说你得到的结果。 – jfriend00

+0

你为什么没有反应?我测试了你的场景,并收到了不同的结果,向你解释并向你提出了一些问题,现在你不在身边。 – jfriend00

回答

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上。