【问题标题】:Executing Express res.render in a async manner以异步方式执行 Express res.render
【发布时间】:2013-09-29 10:56:27
【问题描述】:

我有一个 nodejs 应用程序,其中res.render 的 express 方法以阻塞方式花费了大约 400 毫秒。我如何处理这个以非阻塞方式执行?我的 apache 基准测试需要 12 秒来执行大约 30 个并发请求。如何以更好的方式实现这一点?

var start = +new Date;
//fetch data from redis
console.log('time taken to fetch data from redis ' + (+new Date - start)); //30 ms
res.render('some_jade_view', params);
console.log('time taken to render data ' + (+new Date - start)); //530 ms

我尝试了process.nextTick,但没有太大帮助,ab 结果是一样的。

【问题讨论】:

  • 给我们看一些代码。尤其是带有 .render 调用的部分。
  • @Krasimir 添加了代码,但这并没有多大帮助,因为玉视图需要 500 毫秒的时间来渲染。现在,我注意到它本质上是阻塞的。 res 是传递给快速路由的响应对象。
  • 玉观是不是极其复杂?您是否添加了任何可能会延迟渲染的中间件?
  • @WiredPrairie 没那么复杂,它只是创建了大约 200 KB 的 HTML ;) 好吧,问题仍然是使 res.render 非阻塞,这样即使它很复杂,它适用于 30 个同时连接。
  • 也许这个:stackoverflow.com/questions/16280917/…。没有什么开关可以进行需要顺序异步渲染的长时间阻塞调用。

标签: javascript node.js asynchronous express pug


【解决方案1】:

我认为你真的应该看看https://github.com/caolan/async

直接来自 Async 的仓库:

Async 是一个实用模块,它提供了直接、强大的 用于处理异步 JavaScript 的函数。 (...)

Async 提供了大约 20 个函数,其中包括通常的“函数式” 嫌疑人(map、reduce、filter、each…)以及一些常见的模式 用于异步控制流(并行、串行、瀑布......)。全部 这些函数假定您遵循提供的 node.js 约定 单个回调作为异步函数的最后一个参数。

干杯。

编辑:我不确定以异步方式呈现您的视图是否真的可以帮助您减少时间。您可能希望在客户端实现一个流,以便在数据出现时获取和模板化数据。为此,您可以使用像 Angular 这样的前端框架,或者手动进行。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多