【发布时间】:2014-05-24 06:36:48
【问题描述】:
已编辑
我有一个 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);
这是本地端(省略明显的东西),其中 getInfo 是导出的方法:
std::string ret2 (){
sleep(1);
return string("{\"image\":\"1.JPG\"}");
}
Handle<Value> getInfo(const Arguments &args) {
HandleScope scope;
if(args.Length() == 0 || !args[0]->IsFunction())
return ThrowException(Exception::Error(String::New("Error")));
Persistent<Function> fn = Persistent<Function>::New(Handle<Function>::Cast(args[0]));
Local<Value> objRet[1] = {
String::New(ret2().c_str())
};
Handle<Value> ret = fn->Call(Context::GetCurrent()->Global(), 1, objRet);
return scope.Close(Undefined());
}
我用 3 个 curl 并行请求来解决这个问题
for i in {1..3}; do time curl --request POST --data-binary "@/home/user/Pictures/129762.jpg" http://192.160.0.1:9999/test & done
这是服务器的输出:
<req>/test</req>
---req received---
1397569891165
------------------
<req>/test</req>
---req received---
1397569892175
------------------
<req>/test</req>
---req received---
1397569893181
------------------
这些来自客户端的响应和时间:
"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
显然请求是在前一个服务完成后收到的。 sleep(1) 模拟一个需要大约 1 秒才能完成且无法更改的同步操作。 客户端以约 1 秒的增量延迟接收响应。
我想实现一种并行性,尽管我知道我处于单线程环境中,例如 nodeJS。我想要实现的是收到所有 3 个答案是 ~1s。
提前感谢您的帮助。
【问题讨论】:
标签: javascript node.js http asynchronous v8