var app = require('koa')();
app.use(function *(next) {
var result = compiled(data);
this.body = result;
});
app.listen(8080);
这里compiled是一个模板编译函数,是同步的。可能发生的情况是,data或者html有问题,导致compiled执行的时候发生死循环,这样整个服务会导致cpu100%然后挂掉,后续请求无法进行。 我在想是否有一种方法可以让compiled变成非阻塞的?这样就算compiled某一个请求死循环的时候,至少保证cpu不会100%,后续的请求不会阻塞。理论上是否有可行的方法?是不是要修改底层的东西才能实现?还有一个关键问题是,this.body不能在一个异步回调的函数里来赋值
38 回复
@hwoarangzk 把异步方法用generator来管理异步流程就可以了 koa内部是用这个来管理的 你最好不要使用callback了 用promise和generator把它平展开 自豪地采用 CNodeJS ionic
@hwoarangzk 我做的东西和你差不多 但是我的模板是用的swig 目前我没有觉得有什么问题 你的compiler如果是要动态提供才会想你这样可能出错 那也就只能看看用超时了 自豪地采用 CNodeJS ionic
app.use(function *(next) {
var self = this;
setTimeout(function() {
self.body = compiled(data);
}, 1000);
});
你是说像这样么?
还是不大明白你说的setTimeout和抛出错误的意义? 你是想类似:
app.use(function *(next) {
var self = this;
setTimeout(function() {
self.throw(408, 'timeout');
}, 1000);
this.body = compiled(data);
});
这样吗?如果超时,我至少可以抛出错误,能够处理?
对node而言,回调内部的硬性CPU运算消耗是无法避免的,如果你有资源,可以做成远程调用,让别人帮你算,算完之后传给你。就你提出的具体问题,我觉得你还是想办法把死循环原因找出来,消灭掉,这个是程序错误造成的,而非真实的计算消耗。我说的办法是真实的计算消耗,可以异步远程调用(可以是其他CPU,或者是其他计算机)。