这是我的代码: server.js
var fs = Npm.require('fs');
Meteor.methods({
"test":function(a){
this.unblock();
if(a==1){
//NVIDIA is a test file and size is 40 M ,
//Make the call spend more time to watch block happen
var data = fs.readFileSync("/home/ec/download/NVIDIA");
for(var i=0;i<5;i++){
fs.writeFileSync("/home/ec/download/test/NVIDIA"+i, data);
}
}
console.log(a);
return a;
}
});
client.js
Meteor.call("test",1); Meteor.call("test",2);
结果是:
1 2
第二个呼叫被阻止,并且未创建新的Fibers。 对此有何想法?谢谢!
答案 0 :(得分:9)
我认为这种情况正在发生,因为您正在使用fs.writeFileSync
,它阻止的级别低于Fibers可以访问的级别。
节点等待阻止文件IO操作,该操作仍然使用光纤阻塞,除非您异步使用它。
如果使用回调样式writeFile:
var readFile = Meteor._wrapAsync(fs.readFile.bind(fs));
var writeFile = Meteor._wrapAsync(fs.writeFile.bind(fs));
var data = readFile("/home/ec/download/NVIDIA");
for(var i=0;i<5;i++){
writeFile("/home/ec/download/test/NVIDIA"+i, data);
}
然后,这将把writeFile和readFile方法调到事件循环,光纤可以访问它。
希望这可以为您提供您期望的行为。