我在Node.js中编写了一些测试代码,这些代码只是重复地将HTTP请求发送到Web服务器。以简化形式:
function doPost(opts, data) {
var post_req = http.request(opts, function(res) {
res.setEncoding('utf8')
res.on('data', function (chunk) { })
})
post_req.write(JSON.stringify(data))
post_req.end()
}
setInterval(doPost, interval, opts, msg)
我更喜欢这些请求是按顺序发出的,即在第一次POST收到响应之前没有发送后续POST。
我的问题是:由于运行时使用的non-blocking architecture of the underlying libuv library,此代码是否可能通过与Web服务器的连接发送一个POST,但即使是来自服务器的响应还没有到来?
如果我想象一下select()循环,我可以自由地为第二个POST调用write()并获得EWOULDBLOCK。或者,如果网络中断,它是否会构建排队到IO线程池的POST请求积压?我不清楚在这种情况下我应该期待什么样的行为。在下一个POST开始之前,我必须做些什么来强制完成POST?
答案 0 :(得分:0)
继承Node.js在单个线程上运行,要运行多个进程,您必须运行集群,它们有点类似于Java中的多线程。 (见Node.js documentation on clusters)。例如,您的代码将如下所示:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
}
else {
//call the code in doPost
doPost(opts, data);
}
答案 1 :(得分:0)
我想我找到了答案。我在数据包捕获下运行了一些测试,发现当网络丢失时,重要的是限制你的POST请求,否则请求被排队到IO池,并且取决于连接状态,有些可能发送,其他可能没有,以及消息顺序被破坏了。