2015-11-01 60 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上。