Javascript NodeJS HTTP服务器在V8执行时暂停
已编辑 我有一个nodeJS http服务器,用于接收来自多个客户端的上传并分别处理它们。 我的问题是,我已经验证了第一个请求会阻止任何其他请求的接收,直到前一个请求被送达 这是我测试过的代码: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
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);
}
});