以异步方式执行 Express res.render
Posted
技术标签:
【中文标题】以异步方式执行 Express res.render【英文标题】:Executing Express res.render in a async manner 【发布时间】: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 个同时连接。
也许这个:***.com/questions/16280917/…。没有什么开关可以进行需要顺序异步渲染的长时间阻塞调用。
【参考方案1】:
我认为你真的应该看看https://github.com/caolan/async。
直接来自 Async 的仓库:
Async 是一个实用模块,它提供了直接、强大的 用于处理异步 javascript 的函数。 (...)
Async 提供了大约 20 个函数,其中包括通常的“函数式” 嫌疑人(map、reduce、filter、each…)以及一些常见的模式 用于异步控制流(并行、串行、瀑布......)。全部 这些函数假定您遵循提供的 node.js 约定 单个回调作为异步函数的最后一个参数。
干杯。
编辑:我不确定以异步方式呈现您的视图是否真的可以帮助您减少时间。您可能希望在客户端实现一个流,以便在数据出现时获取和模板化数据。为此,您可以使用像 Angular 这样的前端框架,或者手动进行。
【讨论】:
以上是关于以异步方式执行 Express res.render的主要内容,如果未能解决你的问题,请参考以下文章