【问题标题】:Asynchronous processing of HTTP requests in node节点中HTTP请求的异步处理
【发布时间】:2014-08-23 01:25:16
【问题描述】:

我有一个 node.js 项目,它有一个async::queue,由App::add() 填充。

这是我用来创建服务器的代码:

app = new App config
server = http.createServer (req, res) ->
  app.add req, res, (err) ->
    res.headers = 'Content-Type': 'application/json'
    res.end JSON.stringify error: err
.listen config.port

App::add()req 获取参数并使用回调将任务添加到队列中。 队列使用以end 结尾的函数进行处理。如果发生错误,将发给用户。

到目前为止,工作正常。但是当多个请求并行处理时,一次只处理一个请求。

我试过了:

  • console.loghttp.createServer-callback 的末尾,它被立即调用,但下一个请求只在第一个结束后处理。
  • console.logApp::add()开头,同上

如何处理并发请求?

提前致谢。

编辑:

为了澄清一些事情,这就是我想要的:

  1. 许多客户要求该服务下载 zip 文件
  2. 他们排成一队,n 一次处理
  3. 完成后,每个人都会得到他们的拉链

编辑 2:

我尝试使用cluster module,但这并没有太大帮助,因为无论如何我都必须结束res

编辑 3:

我试图在不关闭的情况下返回一个流,但也没有成功。 我有点绝望,也许我会把人们转发到另一个服务器,在那里他们可以下载他们的文件。

【问题讨论】:

  • 你可以使用 websockets。在初始请求后加载页面,然后在队列的每个回调中将数据发送到页面。只要确保你没有用队列阻塞事件循环并使用process.nextTick()
  • 如何返回数据?至于是什么格式。
  • 压缩文件或应用程序/JSON 错误。
  • 为您的 App.add 函数提供代码
  • App.add() 解析参数并在不到一秒的时间内将项目添加到队列中。

标签: javascript node.js http asynchronous coffeescript


【解决方案1】:

NodeJS 与浏览器中的 javascript 一样,是单线程的。这意味着它一次只能处理一个连续的代码块。在您的示例中(由于您没有为队列处理提供代码,我假设传递的函数是实际的处理代码)。由于它没有任何 I/O(这意味着它不会阻塞等待来自文件系统或数据库等外部源的东西),因此该函数的逻辑必须在 nodejs 开始处理另一个事件之前完全完成。

如果您需要更多详细信息,这是我在 Google 上搜索到的关于 nodejs 如何在并发环境中工作的第一个链接:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

【讨论】:

  • 这对我来说没有意义。我知道,那个节点是单线程的。 http服务器在上次结束后接受一个新请求(res.end()。但我无法想象没有办法异步处理请求。@Ben 提到的 Websocket 是一个想法,但并不理想。
  • 您需要在您的应用程序代码和客户端代码中提供更多上下文,您的基本 sn-p 没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多