FAQ > 金融建模 > 第三方交互 > 其他

Q:如何通过脚本代码的方式使用委托执行功能    

  • A:由于分析研究的特殊性,有些复杂的分析模型或者复杂的数据向导运算无法在短时间内得到结果,可以使用另一种执行的方式:委托执行。
    委托执行不需要用户在线等待结果的返回,运算的结果会存放在服务器的用户空间里。
    发送了委托执行函数命令后,即使用户与服务器断开连接,服务器依旧会执行这些函数,运算结束后用户可以随时通过“用户数据”的功能浏览结果。
    设置委托执行命令请参考:FAQ:Q:委托执行如何操作?
    也可通过脚本代码的方式指定委托执行某个函数,用法可参考模型SendExecute与sendExecuteAndWait
    模型说明:
    SendExecute
    定义:SendExecute(RemoteExec:String;SysParam:Array;CallBack:String;[Online:Boolean=True;]):Integer;
    说明:递交请求给服务器异步执行,当RemoteExec的字符串为空串,且Online为假时,为提交实时订阅。
    参数:
     RemoteExec:string 递交远程的执行串,Program 开始 end.结束。
     例如返回服务器的当前时间
      Program gettimefromserver;
      begin
        return datetimetostr(now());
      end.
     SysParam:array 缺省的服务器系统环境参数。
     CallBack:string 当执行结束或者出错等等回调的TSL语言代码。
     Online:bool 可缺省,默认模式是在线方式,如果为真则在线,如果为假则委托执行
     (最后执行的结果将存贮在用户数据表中,用户数据表的名称则由SysParam里的resultname系统参数设定)
    返回:整数,如果成功则返回和服务器通讯的句柄,0为错误。

    sendExecuteAndWait
    定义:SendExecuteAndWait(RemoteExec:String;SysParam:Array;Var ExecResult;Var EnvOrErr;[Online:Boolean=True;]):Integer;
    说明:递交请求给服务器执行,当RemoteExec的字符串为空串,且Online为假时,为提交实时订阅得到最新的行情状态并结束订阅请求。
    参数:
     RemoteExec:string 递交远程的执行串,Program 开始 end.结束
     例如返回服务器的当前时间
      Program gettimefromserver;
      begin
        return datetimetostr(now());
      end.
     SysParam:array 缺省的服务器系统环境参数
     ExecResult:接受返回结果。
     EnvOrErr:如果执行正确,为返回的辅助结果,辅助的返回结果往往用来描述一些有用的与结果相关的信息,具体内容由模型自己设置到env_return的系统参数中。
    如果执行错误,则返回出错信息。
     Online:bool 可缺省,默认模式是在线方式,如果为真则在线,如果为假则委托执行
     (最后执行的结果将存贮在用户数据表中,用户数据表的名称则由SysParam里的resultname系统参数设定)
    返回:integer,如果成功则返回0,否则返回错误代码。

    SetComputeService
    定义:SetComputeService(Service:String):0
    说明:设置使用的计算的服务群。
    参数:
     Service:字符串,服务群名。空字符串表示默认服务,’auto’表示自动选择,
        否则为指定的服务群名,查看服务器节点参考:FAQ:Q:如何指定天软服务器进行执行命令
    返回:0。
    实现范例:
    新建一个被委托执行的用户函数:
    Function run_weituo();
    Begin
      sleep(60*1000);
      return "睡眠60秒";
    End;

    使用SendExecute委托执行函数
      pstr := 'program do_weituo;
           Begin
            return run_weituo();
           end.';
      //异步委托执行
      ret :=rdo2 SendExecute(pstr, array("ResultName":"do_weituo"), "",false);
      if ret then
      begin
       //执行任务管理命令
        rdo2 TSTaskAdmin("info",CmdReturn,BroadCastMsg,ErrMsg,3000,1000);
        return CmdReturn;
      end
      else
        return ret;
    //返回结果:成功添加委托任务,执行结果返回在用户数据中



    使用sendExecuteAndWait委托执行函数
      pstr := 'program do_weituo;
           Begin
            return run_weituo();
           end.';
      //同步委托执行
      ret:= rdo2 sendExecuteAndWait(pstr,array("ResultName":"do_weituo"),result,errmsg,false);
      if not ret then
      begin
       //执行任务管理命令
        rdo2 TSTaskAdmin("info",CmdReturn,BroadCastMsg,ErrMsg,3000,1000);
        return CmdReturn;
      end
      else
        return errmsg;
    //返回结果:成功添加委托任务,执行结果返回在用户数据中



    指定服务器节点委托执行函数
      //指定服务器节点
      rdo2 setcomputeservice("192.168.102.46:z:\\se");
      pstr := 'program do_weituo;
           Begin
            return run_weituo();
           end.';
      //同步委托
      ret1:= rdo2 sendExecuteAndWait(pstr,array("ResultName":"do_weituo1"),result,errmsg,false);
      //异步委托
      ret2:= rdo2 SendExecute(pstr, array("ResultName":"do_weituo2"), "",false);
      if (not ret1) and ret2 then
      begin
       //使用任务管理命令
        rdo2 TSTaskAdmin("info",CmdReturn,BroadCastMsg,ErrMsg,3000,1000);
        return CmdReturn;
      end
      else
        return 0;
    //执行结果:在指定服务器节点委托执行函数,结果返回在用户数据中



    相关说明:FAQ:Q:如何通过代码的方式使用任务管理命令