即使使用this.unblock(),流星方法也会阻塞。我是否在并发光纤中达到了极限?

时间:2014-01-12 15:22:49

标签: meteor

这是我的代码: 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。 对此有何想法?谢谢!

1 个答案:

答案 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方法调到事件循环,光纤可以访问它。

希望这可以为您提供您期望的行为。