Javascript NodeJS HTTP服务器在V8执行时暂停

Javascript NodeJS HTTP服务器在V8执行时暂停,javascript,node.js,http,asynchronous,v8,Javascript,Node.js,Http,Asynchronous,V8,已编辑 我有一个nodeJS http服务器,用于接收来自多个客户端的上传并分别处理它们。 我的问题是,我已经验证了第一个请求会阻止任何其他请求的接收,直到前一个请求被送达 这是我测试过的代码: var http = require('http'); http.globalAgent.maxSockets = 200; var url = require('url'); var instance = require('./build/Release/ret'); http.createServ

已编辑

我有一个nodeJS http服务器,用于接收来自多个客户端的上传并分别处理它们。 我的问题是,我已经验证了第一个请求会阻止任何其他请求的接收,直到前一个请求被送达

这是我测试过的代码:

var http = require('http');
http.globalAgent.maxSockets = 200;
var url = require('url');
var instance = require('./build/Release/ret');

http.createServer( function(req, res){
    var path = url.parse(req.url).pathname; 
    console.log("<req>"+path+"</req>");
    switch (path){
        case ('/test'): 
            var body = [];
            req.on('data', function (chunk) {
                body.push(chunk);
            });
            req.on('end', function () {
                body = Buffer.concat(body);
                console.log("---req received---");
                console.log(Date.now());
                console.log("------------------");          
                instance.get(function(result){
                  postHTTP(result, res);
                });
            });
        break;
    }
}).listen(9999);
这是服务器的输出:

<req>/test</req>
---req received---
1397569891165
------------------
<req>/test</req>
---req received---
1397569892175
------------------
<req>/test</req>
---req received---
1397569893181
------------------
显然,请求是在前一个请求送达后收到的。睡眠(1)模拟一个同步操作,需要大约1s才能完成,并且无法更改。 客户端以~1s的增量延迟接收响应

我希望实现某种并行性,尽管我知道我处于单线程环境中,比如nodeJS。我希望得到的是,3个答案都是~1

提前感谢您的帮助。

此:

for(var i=0;i<1000000000;i++) var a=a+i;
现在,通过附加
数据
事件处理程序,然后将整个流加载到内存中,可以将非流动流转换为流动模式。你可能不想这么做

如下图所示,您可以在now flowing模式下使用流,如果您希望将数据发送到仅在其他事件之后才可访问的某个位置,这将非常有用

但是,以流动模式使用流是最快的。如果您想编写自己的主体解析器,我想您可能想使用流模式,这取决于您的用例

req.on('readable', function () {
   var chunk;
   while (null !== (chunk = readable.read())) {
       body.push(chunk);
   }
});

流动和非流动模式也分别称为v1和v2流,因为节点中使用的旧流仅支持流动模式。

我尝试设置超时,但正如您所说,这是一个非阻塞操作。在我的实际部署中,我有一个阻塞操作,所以我认为这是一个很好的模拟方法。我不确定在这种情况下如何侦听可读流事件。我建议您更改实际部署以删除该阻塞操作,任何阻塞操作都会对node.js性能造成致命影响。实际部署中的阻塞操作是什么?nodejs中的大多数操作都在后台执行阻塞操作,即使是c模块,也可以在线程中执行操作,然后在操作完成时调用回调。永远不要使用fs。[read | write]同步调用,始终使用异步调用。不能使用线程,因为我链接到节点C扩展的所有库都是线程安全的。我将尝试节点ffi,看看是否有任何不同。想不出其他任何东西。如果阻塞操作对时间不敏感,可以将其计算分散到事件循环上。如果您愿意分享您的用例,我们可能会给您一些更可靠的反馈。
"1.JPG"
real    0m1.024s
user    0m0.004s
sys         0m0.009s
"1.JPG"
real    0m2.033s
user    0m0.000s
sys         0m0.012s
"1.JPG"
real    0m3.036s
user    0m0.013s
sys         0m0.001s
for(var i=0;i<1000000000;i++) var a=a+i;
setTimeout(function)({
    send404(res);
}, 3000);
req.on('readable', function () {
   var chunk;
   while (null !== (chunk = readable.read())) {
       body.push(chunk);
   }
});