Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js DNode服务器方法超时_Node.js_Dnode - Fatal编程技术网

Node.js DNode服务器方法超时

Node.js DNode服务器方法超时,node.js,dnode,Node.js,Dnode,我们希望在需要RPC功能的项目中使用NodeJs DNode()。 它已经过设置和测试,似乎非常适合该项目 不过有点小麻烦。远程功能可以由用户定义,因此我们无法控制逻辑。这意味着函数可能写得不好,执行时间过长,甚至可能永远无法完成(无休止的循环) 所以问题:有没有办法在生成的服务器连接/调用上实现超时检查/事件/触发器。 e、 g.如果函数的执行时间超过5秒,则中止该函数并将异常信息返回给客户端 注意:我们已经在客户机上实现了超时逻辑,所以这不是问题。只是不希望虚假的僵尸进程无缘无故地阻塞服务器

我们希望在需要RPC功能的项目中使用NodeJs DNode()。 它已经过设置和测试,似乎非常适合该项目

不过有点小麻烦。远程功能可以由用户定义,因此我们无法控制逻辑。这意味着函数可能写得不好,执行时间过长,甚至可能永远无法完成(无休止的循环)

所以问题:有没有办法在生成的服务器连接/调用上实现超时检查/事件/触发器。
e、 g.如果函数的执行时间超过5秒,则中止该函数并将异常信息返回给客户端

注意:我们已经在客户机上实现了超时逻辑,所以这不是问题。只是不希望虚假的僵尸进程无缘无故地阻塞服务器组件

编辑:*--添加代码示例--*
Server(侦听端口8000,callMe()函数调用doWork(),永不结束。)

var dnode=require('dnode');
功能定位(cltId){
console.log('Client:'+cltId);
setTimeout(函数(){doWork(cltId);},5000);
}
var服务器=dnode({
callMe:函数(cltId、cb){
道尔克(cltId);
}
});
服务器监听(8000);
客户端(连接端口8000和rpccallMe(),永远不会返回)

var dnode=require('dnode');
var net=要求的(‘净额’);
var d=dnode();
d、 打开(“远程”,功能(远程){
var cltId='c-'+Math.random().toString(16).slice(2);
remote.callMe(cltId,函数){
console.log('Result='+n);
d、 end();
});
});
var conn=净连接(8000);
连接管道(d)、管道(连接);
当客户端运行时,它将挂起,但它可以被终止,也可以设置超时以结束连接。这样客户就可以继续做其他事情了

但是

服务器仍将愉快地用我们永无止境的一段代码划船离开…

随着越来越多的客户端连接并调用dodge代码,我们最终会遇到更多的虚假僵尸,直到最终我想象所有服务器资源都被消耗。

我想你对dnode的功能感到困惑。与dnode一起使用的函数仅在定义的一侧执行。看起来好像回调正在被序列化并在连接的另一端执行,但事实并非如此

例如,如果客户端执行以下操作:

var d = dnode({
  callMe: function () { while (true) }
});
d.pipe(stream).pipe(d);

服务器调用
callMe()
,客户端将挂起
,而(true)
,而不是服务器。

客户端代码可以执行以下操作:

d.on('remote', function (remote) {
    var cltId = 'c-' + Math.random().toString(16).slice(2);
    var t = setTimeout(function() {
        t = null;
        console.log("timed out!");
        d.end();
    }, 5e3);

    remote.callMe(cltId , function (s) {
        if(t === null) return; //too late...
        clearTimeout(t);
        console.log('Result=' + n);
        d.end();
    });
});

(未经测试!)

是的,没有得到它。我的理解是,您已经定义了客户端将调用的服务器代码。我用一个简单的客户机/服务器示例更新了我的问题,试图帮助澄清。