加速这个(基本的)node.js服务器

时间:2012-09-20 17:16:34

标签: javascript python node.js

我有一个(愚蠢的)node.js服务器,其唯一目的是为每个请求传递的数据调用一个函数,并回答该函数的结果。这是我使用的代码:

var pageDown = require('./PageDown/Markdown.Sanitizer').getSanitizingConverter(),
 http = require('http');

http.createServer(function (req, res) {
  var data = "";
  res.writeHead(200, {'Content-Type': 'text/plain'});
  req.on('data', function (chunk) {
    data += chunk;
  });
  req.on('end', function() {
    res.end(pageDown.makeHtml(data));
  });
}).listen(1337, '127.0.0.1');
console.log('HServer running at http://127.0.0.1:1337/');

我使用python中的这个服务器使用以下代码(atm我只是基准测试所以它只是一个压力测试):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests

for i in range(1, 100000):
    r = requests.post('http://localhost:1337/', data="lol")
    print i
print "I'm done :')"

我的问题是这种完成工作的方式很慢。我有一个大型数据库,需要使用此javascript函数进行处理,我正在寻找方法使上述过程更快。所以欢迎提出建议!

2 个答案:

答案 0 :(得分:4)

您没有使用node.js的异步设计。事实上你在做恕我直言是反模式。

如果您必须在node.js中进行计算,那么服务器代码是正确的。但是要利用异步架构您应该将许多node.js服务器实例放在负载均衡器之后。您甚至可以在一台计算机上运行此实例以使用多个核心。

并且要让客户从这么多实例中获利,您也应该异步进行发布调用。要执行此操作而不是请求,请使用某些异步http客户端,例如http://www.tornadoweb.org/documentation/httpclient.html

它允许您并行地在node.js实例中进行计算。

答案 1 :(得分:2)

如果您正在调用节点进程来清理HTML,为什么不在python中执行此操作?我假设您指向的降价转换器就是这个:http://code.google.com/p/pagedown/source/browse/Markdown.Sanitizer.js。如果是这种情况,为什么不将它转换为python(或找到类似的python代码),并在进程中使用它。通过简单地运行这个过程来进行网络调用似乎很疯狂,因为它比在python中完成所有操作要慢得多。以下是我能找到的一些python markdown工具:http://packages.python.org/Markdown/https://github.com/trentm/python-markdown2