var http = require('http');
var fs = require('fs');
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{
http.createServer(function(request, response) {
var file = parseInt(request.url.substring(1));
file = file % 200;
file = String("000"+ file).slice(-3);
// read the file
fs.readFile('../data/input'+file+'.txt','ascii',function(err, data) {
if(err) {
response.writeHead(400, {'Content-Type':'text/plain'});
response.end();
}
else{
var results = data.toString().split("\r\n");
results.sort();
response.writeHead(200, {'Content-Type':'text/plain'});
response.end('input'+file+'.txt\t'+ results[(parseInt(results.length/2))]);
}
});
}).listen(8080,'127.0.0.1');
}
console.log('Server running at http://127.0.0.1:8080/') 最后,我们来看看.NET服务实现,确切的说我们用的是.NET 4.5版本,自带async/await功能。如我前面提到的一样,我希望用不带IIS或者ASP.NET的纯.NET来和node比较,所以我用一个简单的HTTP监听程序来开始:
publicasync Task Start()
{
while(true)
{
var context = awaitthis.listener.GetContextAsync();
this.ProcessRequest(context);
}
} 通过这个我可以开始处理各个请求,请求一进来我读取文件流系统,并没有阻塞线程池里的线程,然后执行内存排序,这是用Array.Sort重写的一个简单任务。对于.NET,在这里通过参照并行编程写的并行排序算法使得程序有了显著的性能提升,但是我没有选择这样是因为这不是这两者比较的重点。
private async void ProcessRequest(HttpListenerContext context)
{
try
{
var filename = this.GetFileFromUrl(context.Request.Url.PathAndQuery.Substring(1));
string rawData = string.Empty;
using (StreamReader reader = new StreamReader(Path.Combine(dataDirectory, filename)))
{
rawData = await reader.ReadToEndAsync();
}
var sorted = await this.SortAsync(context, rawData);
var response = encoding.GetBytes(String.Format("{0}\t{1}", filename, sorted[sorted.Length / 2]));
await context.Response.OutputStream.WriteAsync(response, 0, response.Length);
context.Response.StatusCode = (int)HttpStatusCode.OK;
}
catch(Exception e)
{
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
Console.WriteLine(e.Message);
}
finally
{
context.Response.Close();
}
}
private async Task SortAsync(HttpListenerContext context, string rawData)
{
return await Task.Factory.StartNew(() =>
{
var array = rawData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
Array.Sort(array);
return array;
});
}