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

L.T*_*L.T 4 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

client.js

Meteor.call("test",1);
Meteor.call("test",2);

结果是:

1
2

第二个呼叫被阻止,并且未创建新的Fibers.对此有何想法?谢谢!

Aks*_*hat 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);
}
Run Code Online (Sandbox Code Playgroud)

然后,这将把writeFile和readFile方法调到事件循环,光纤可以访问它.

希望这应该给你你期望的行为.